Avatar billede ghazaleh Nybegynder
04. maj 2005 - 13:03 Der er 14 kommentarer og
1 løsning

Hente oplysninger i en anden tabel med en fremmednøgle

Jeg har følgende kode:

        Dim con As SqlConnection = New SqlConnection("server=MFFUTURA;Integrated Security=SSPI;database=F9999")
        con.Open()
        Dim cmd As SqlCommand = New SqlCommand("SELECT * FROM ord WHERE free4<>1", con)
        Dim rdr As SqlDataReader = cmd.ExecuteReader
        While rdr.Read
            kundenr = CType(rdr(4), String)
            Dim cmd2 As SqlCommand = New SqlCommand("SELECT * FROM actor WHERE custno=" & kundenr, con)
            Dim rdr2 As SqlDataReader = cmd2.ExecuteReader
            Ordrenr = CType(rdr(0), String)
            Ordredato = CType(rdr(3), String)
            Forventetreturdato = CType(rdr(123), String)
            afdnr = CType(rdr2(99), String)
            Kundenavn = CType(rdr(5), String)
            Adresse1 = CType(rdr(6), String)
            Adresse2 = CType(rdr(7), String)
            Postnr = CType(rdr(10), String)
            By = CType(rdr(11), String)
            Ubernahmescheinnr = CType(rdr(24), String)
            gr2 = CType(rdr(19), String)
            Dim cmd3 As SqlCommand = New SqlCommand("SELECT * FROM txt WHERE Lang=49 AND TxtTp=49 AND TxtNo=" & gr2, con)
            Dim rdr3 As SqlDataReader = cmd2.ExecuteReader
            leveringsadresseforcontaineren = CType(rdr3(4), String)
            tekst = Ordrenr & ", " & Ordredato & ", " & Forventetreturdato & ", " & afdnr & ", " & Kundenavn & ", " & Adresse1 & ", " & Adresse2 & ", " & Postnr & ", " & By & ", " & Ubernahmescheinnr & ", " & leveringsadresseforcontaineren & ", " & Sdato & ", " & Stid
            ListBox1.Items.Add(tekst)
        End While
        con.Close()

Mit program går i fejl ved linien:

Dim rdr2 As SqlDataReader = cmd2.ExecuteReader

Med denne fejlmeddelelse:

An unhandled exception of type 'System.InvalidOperationException' occurred in system.data.dll

Additional information: There is already an open DataReader associated with this Connection which must be closed first.

Er der nogle der kan se hvad der er galt?
Avatar billede arne_v Ekspert
04. maj 2005 - 14:18 #1
Ja sæt en

rdr2.Close

ind inden du åbner næste reader
Avatar billede arne_v Ekspert
04. maj 2005 - 14:19 #2
skal

Dim rdr3 As SqlDataReader = cmd2.ExecuteReader

iøvrigt ikke være

Dim rdr3 As SqlDataReader = cmd3.ExecuteReader

?
Avatar billede arne_v Ekspert
04. maj 2005 - 14:20 #3
ups - du har ikke 2 readere med 3 readere

så skal du have en seperat connection til den yderste reader
Avatar billede arne_v Ekspert
04. maj 2005 - 14:21 #4
Dim outercon As SqlConnection = New SqlConnection("server=MFFUTURA;Integrated Security=SSPI;database=F9999")
        outercon.Open()
        Dim con As SqlConnection = New SqlConnection("server=MFFUTURA;Integrated Security=SSPI;database=F9999")
        con.Open()
        Dim cmd As SqlCommand = New SqlCommand("SELECT * FROM ord WHERE free4<>1", outercon)
        Dim rdr As SqlDataReader = cmd.ExecuteReader
        While rdr.Read
            kundenr = CType(rdr(4), String)
            Dim cmd2 As SqlCommand = New SqlCommand("SELECT * FROM actor WHERE custno=" & kundenr, con)
            Dim rdr2 As SqlDataReader = cmd2.ExecuteReader
            Ordrenr = CType(rdr(0), String)
            Ordredato = CType(rdr(3), String)
            Forventetreturdato = CType(rdr(123), String)
            afdnr = CType(rdr2(99), String)
            Kundenavn = CType(rdr(5), String)
            Adresse1 = CType(rdr(6), String)
            Adresse2 = CType(rdr(7), String)
            Postnr = CType(rdr(10), String)
            By = CType(rdr(11), String)
            Ubernahmescheinnr = CType(rdr(24), String)
            gr2 = CType(rdr(19), String)
            rdr2.Close()
            Dim cmd3 As SqlCommand = New SqlCommand("SELECT * FROM txt WHERE Lang=49 AND TxtTp=49 AND TxtNo=" & gr2, con)
            Dim rdr3 As SqlDataReader = cmd2.ExecuteReader
            leveringsadresseforcontaineren = CType(rdr3(4), String)
            tekst = Ordrenr & ", " & Ordredato & ", " & Forventetreturdato & ", " & afdnr & ", " & Kundenavn & ", " & Adresse1 & ", " & Adresse2 & ", " & Postnr & ", " & By & ", " & Ubernahmescheinnr & ", " & leveringsadresseforcontaineren & ", " & Sdato & ", " & Stid
            ListBox1.Items.Add(tekst)
            rdr3.Close()
        End While
        rdr.Close()
        con.Close()
        outercon.Close()
Avatar billede arne_v Ekspert
04. maj 2005 - 14:22 #5
Kunne du iøvrigt ikke nøjes med en SELECT som joiner de 3 tabeller sammen ?
Avatar billede ghazaleh Nybegynder
04. maj 2005 - 14:25 #6
Tak for kommentarerne.

jo en JOIN ville gøre det hele væsentligt nemmere. JEg har dog ikke brugt JOIN før. Hvordan ville sådan en sql sætning se ud?
Avatar billede ghazaleh Nybegynder
04. maj 2005 - 14:34 #7
jeg har lige prøvet din kode. Nu kommer den lidt længere, men går i fejl ved denne linie:

afdnr = CType(rdr2(99), String)

Med denne fejlmeddelelse:

An unhandled exception of type 'System.InvalidOperationException' occurred in system.data.dll

Additional information: Invalid attempt to read when no data is present.

Den bedste løsning ville nok være at bruge JOIN i stedet, som du foreslog. Jeg skal hente 2 værdier fra 2 andre tabeller. Hvordan vil sådan en JOIN sætning se ud?
Avatar billede arne_v Ekspert
04. maj 2005 - 14:37 #8
Du har vel ikke en kolonne 99 (hvilket er kolonne nr. 100 da den starter i 0)
Avatar billede arne_v Ekspert
04. maj 2005 - 14:38 #9
SELECT *
FROM ord,actor,txt
WHERE ord.x=actor.x AND ord.y=txt.y

jeg ved ikke hvad x og y skal hedde
Avatar billede ghazaleh Nybegynder
04. maj 2005 - 14:41 #10
ok det prøver jeg lige

jo det er voldsomt store tabeller - jeg har taget højde for at man starter ved 0

Tabellerne kan faktisk have op til ca. 200 felter :-)
Avatar billede ghazaleh Nybegynder
04. maj 2005 - 14:57 #11
øv min sql sætning giver fejl. Det var ellers lige perfekt, hvis det virkede.

Jeg prøvede først med:

Dim cmd As SqlCommand = New SqlCommand("SELECT * FROM(ord, actor, txt) WHERE ord.free4=1 AND ord.CustNo=actor.CustNo AND ord.Gr2=txt.txtno AND txt.Lang=49 AND txt.TxtTp=49", con)

Så tænkte jeg at jeg ville specificere mine felter sådan her:

Dim cmd As SqlCommand = New SqlCommand("SELECT ord.OrdNo, ord.OrdDt, ord.ERetDt, ord.Nm, ord.Ad1, ord.Ad2, ord.PNo, ord.PArea, ord.inf, actor.inf, txt.txt FROM(ord, actor, txt) WHERE ord.free4=1 AND ord.CustNo=actor.CustNo AND ord.Gr2=txt.txtno AND txt.Lang=49 AND txt.TxtTp=49", con)

Men begge sætninger gik desværre i fejl
Avatar billede arne_v Ekspert
04. maj 2005 - 14:59 #12
Prøv og undlad () omkring tabelnavne
Avatar billede arne_v Ekspert
04. maj 2005 - 14:59 #13
Dim cmd As SqlCommand = New SqlCommand("SELECT * FROM ord, actor, txt WHERE ord.free4=1 AND ord.CustNo=actor.CustNo AND ord.Gr2=txt.txtno AND txt.Lang=49 AND txt.TxtTp=49", con)
Avatar billede ghazaleh Nybegynder
04. maj 2005 - 15:33 #14
Så fungerer det. Tak for hjælpen!
Avatar billede arne_v Ekspert
04. maj 2005 - 15:41 #15
så ligger jeg et svar
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester