18. april 2005 - 10:38Der er
10 kommentarer og 1 løsning
Dynamisk sql-string
Er ved at lave en .net løsning (VB) på en MSsql-database.
Jeg har to tabeller: tbl_komponentmaster og tbl_komponentmasterSetting. I tbl_komponentmaster har jeg komponenter, med tilhørende categoriID. Ikke alle felter skal udfyldes/vises for de enkelte komponenter. Styringen af hvilke felter, der skal vises/udfyldes vil jeg gemme i tbl_komponentmasterSetting (UniqueID, categoryID, CategoryName + alle felter fra tbl_komponentmaster oprettet som bit-felter. En række i tbl_komponentmasterSetting ser derfor f.eks. sådan ud:
UniqueID 1 categoryID 7 CategoryName bolte length 1 (checked/vises) pressure 0 (unchecked/vises ikke) osv... Jeg vil så lave en dynamisk sql-streng, hvor jeg henter alle felter som er = 1 (- altså alle felter der skal vises) Denne sql-streng vil jeg så overføre som parameter til en stored procedure, som så returnerer resultatet til applikationen. Det skulle gerne ende med at jeg kun får vist de felter fra tbl_komponentmaster som er = 1 i tbl_komponentmasterSettings.
damn... har siddet i en time og forsøg at ave noget der virkede, men ude held... Havde forsøgt at erklære en variabel af tyen table og for hver test af bits så kalde ALTER TABLE og update med værdien der skulle ud, men man kan åbenbart ikke lave alter table på en @variabel. Jeg vil foreslå dig at du gør en af to ting:
1: dropper tbl_komponentmasterSetting og istedet lader være med at udfylde de columns i tbl_komponentmaster, der ikke skal med for den enkelte record.
2: gør tbl_komponentmasterSetting lodret i stedet fo vandret. eks.
det forstår jeg ikke rigtigt... Jeg laver et kald til tbl_komponentmaster
Kald 1:
select <kolonner> from tbl_komponentmaster where CategoryID = 7
<kolonner> skal vælges som en selection ud fra tbl_komponentmasterSetting (I denne tabel har jeg alle feltdefinitioner fra tbl_komponentmaster + id(auto) + categoryID (som er hentet/Oprettet ud fra en kategoritabel)
Kald 2: select * from tbl_komponentmasterSetting where categoryID = 7 hvor jeg overfører et categoryID, og får rækken med dette id. dette vil f.eks. give: id 555 CategoryID 7 partn_no 1 (bit) name 1 (bit) length 1 (bit) width 0 (bit) Rækken hvis kolonner så har værdien 1 (felter som skal vises) skal så laves som en parameter der skal indsættes i første sql-sætning <kolonner> (Kald 1) Kan de overhovedet lade sig gøre...
Jeg kan ikke overskue en løsning i transact sql. Hvis det skal foregå på den måde, så er det måske bedre at lave noget kode i vb, der kan tage sig af det
kald fra vb: "SELECT * FROM ...setting" opbyg en streng på formen: Streng = "column1,column12,column3... osv." selvfølgelig skal de kun med hvis bitten er 1.
jeg er ikke særlig hård i vb, men det her giver dig strengen:
Dim cmd As OleDb.OleDbCommand Dim r As OleDb.OleDbDataReader Dim s As String sqlconn.Open()
cmd = sqlconn.CreateCommand()
cmd.CommandText = "SELECT * FROM setting WHERE id = 1;" r = cmd.ExecuteReader() s = "" If r.Read Then If (r.GetBoolean(1)) Then s = s & r.GetName(1) & "," If (r.GetBoolean(2)) Then s = s & r.GetName(2) & "," If (r.GetBoolean(2)) Then s = s & r.GetName(3) & "," If (r.GetBoolean(2)) Then s = s & r.GetName(4) & "," s = s.Remove(s.Length - 1, 1)
TextBox1.Text = s End If
jeg har en tabel der hedder setting med id (int),col1, col2, col3, col4 (bit)
Ok - det virker fint nok - Hvordan får jeg så overført s til min stored proc. Har prøvet med: CREATE PROCEDURE dbo.SP_TestMaster @inParentID int, @aktiv int, @selectstring text AS SELECT @selectstring FROM tbl_component_master WHERE (tbl_component_master.Active = @aktiv) AND (tbl_component_master.Category_discriminator = @inParentID) GO Men jeg får ikke noget fornuftigt tilbage...
synes du det er helt fair selv at tage alle pointene?
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.