webForumDet fria alternativet

datareader i datareader

7 svar · 408 visningar · startad av andreas_lindh

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#1

jag har den här koden

Dim objcmd5 As New OdbcCommand _
            ("SELECT Id,namn from s_deltagande_lag where namn ='Tibro IK' and Serie_ID = " & viewstate("serie") & "", objconn)
        Dim dr2 As OdbcDataReader = objcmd5.ExecuteReader(CommandBehavior.CloseConnection)
        If dr2.Read() = True Then

            Dim objcmd6 As New OdbcCommand _
                ("SELECT id from trupper where lagID=" & viewstate("lag_id") & "", objconn)
            Dim dr5 As OdbcDataReader = objcmd6.ExecuteReader(CommandBehavior.CloseConnection)
            While dr5.Read
                Dim strsql6 As String = "insert into Statistik(SerieID,LagID,SpelarID) values (" & viewstate("serie") & "," & viewstate("lag") & "," & dr5("id") & ")"
                Dim objcmd7 As New OdbcCommand(strsql6, objconn)
                objconn.Close()
                objcmd7.Connection.Open()
                objcmd7.ExecuteNonQuery()
                objcmd7.Connection.Close()
            End While
        End If

Och jag får det här felet

Exception Details: System.InvalidOperationException: ExecuteReader requires an open and available Connection. The connection's current state is Closed.

Source Error: 

Line 121:        Dim objcmd5 As New OdbcCommand _
Line 122:            ("SELECT Id,namn from s_deltagande_lag where namn ='Tibro IK' and Serie_ID = " & viewstate("serie") & "", objconn)
Line 123:        Dim dr2 As OdbcDataReader = objcmd5.ExecuteReader(CommandBehavior.CloseConnection)
Line 124:        If dr2.Read() = True Then
Line 125:
 

Source File: d:\inetpub\wwwroot\tibroik.net\admin2\serier.aspx.vb    Line: 123

Hur ska jag göra för att det här ska fungera?

PatrikBMedlem sedan mars 20002 836 inlägg
#2

När du använder en datareader så måste du hålla en connection öppen hela tiden från det att du börjar att loopa tills det att du loopat färdigt.

En annan sak med DataReader. Du kan endast ha en öppen datareader i samma connection.

cya,
PatrikB

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#3

nu har jag ändrat lite men det fungerar fortfarande inte

Dim sign As String
        Dim objcmd5 As New OdbcCommand _
                    ("SELECT Id,namn from s_deltagande_lag where namn ='Tibro IK' and Serie_ID = " & viewstate("serie") & "", objconn)
        Dim dr2 As OdbcDataReader
        objconn.Open()
        dr2 = objcmd5.ExecuteReader
        If dr2.Read() = True Then
            sign = "true"
        End If
        dr2.Close()
        objconn.Close()
        If sign = "true" Then
            Dim objcmd6 As New OdbcCommand _
                ("SELECT id from trupper where lagID=" & viewstate("lag_id") & "", objconn)

            Dim dr5 As OdbcDataReader
            objconn.Open()
            dr5 = objcmd6.ExecuteReader
            While dr5.Read
                Dim strsql6 As String = "insert into Statistik(SerieID,LagID,SpelarID) values (" & viewstate("serie") & "," & viewstate("lag") & "," & dr5("id") & ")"
                Dim objcmd7 As New OdbcCommand(strsql6, objconn)
                objconn.Close()
                objcmd7.Connection.Open()
                objcmd7.ExecuteNonQuery()
                objcmd7.Connection.Close()
            End While
            dr5.Close()

Då får jag felet

Exception Details: System.InvalidOperationException: Invalid attempt to Read when reader is closed.

Source Error: 

Line 139:            objconn.Open()
Line 140:            dr5 = objcmd6.ExecuteReader
Line 141:            While dr5.Read
Line 142:                Dim strsql6 As String = "insert into Statistik(SerieID,LagID,SpelarID) values (" & viewstate("serie") & "," & viewstate("lag") & "," & dr5("id") & ")"
Line 143:                Dim objcmd7 As New OdbcCommand(strsql6, objconn)
 

Source File: d:\inetpub\wwwroot\tibroik.net\admin2\serier.aspx.vb    Line: 141

Det fungerar om jag byter while dr5.read mot if dr5.read men då får jag ju inte med alla poster från trupper

PatrikBMedlem sedan mars 20002 836 inlägg
#4

Men fortfarande stänger du den connection du skapar dina command-object med inne i datareader loopen:

            While dr5.Read
                Dim strsql6 As String = "insert into Statistik(SerieID,LagID,SpelarID) values (" & viewstate("serie") & "," & viewstate("lag") & "," & dr5("id") & ")"
                Dim objcmd7 As New OdbcCommand(strsql6, objconn)
                [b]objconn.Close()
                objcmd7.Connection.Open()[/b]
                objcmd7.ExecuteNonQuery()
                [b]objcmd7.Connection.Close()[/b]
            End While

Det är därför som du får felet.

Vet inte vad det är för ngt som du vill åstadkomma.
Förklara vad du vill ska hända/ske så kanske vi kan komma med förslag på en bättre lösning än denna nestlade loop

cya,
PatrikB

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#5

Det här vill jag ska hända.

Användaren skriver in en hockeyserie.
Namnet sparas i tabellen serie
Skriver in vilka lag som ska vara med i serien. Ett av lagen heter alltid Tibro IK. lagen sparas i en tabell s_deltagande_lag

Jag har en tabell med alla spelare i Tibro IK.
Jag vill hämta alla spelare och stoppa in dom i tabellen statistik.

i viewstate("serie") sparar jag id på den serien som skapades.
i viewstate("lag") sparar jag id:t på tibro IK från tabellen s_deltagande_lag.

jag tror inte att det är därför jag får felet. jag har testat utan objconn.close och då får jag felet

Exception Details: System.InvalidOperationException: The connection is already Open (state=Open).

Source Error: 

Line 142:                Dim strsql6 As String = "insert into Statistik(SerieID,LagID,SpelarID) values (" & viewstate("serie") & "," & viewstate("lag") & "," & dr5("id") & ")"
Line 143:                Dim objcmd7 As New OdbcCommand(strsql6, objconn)
Line 144:                objcmd7.Connection.Open()
Line 145:                objcmd7.ExecuteNonQuery()
Line 146:                objcmd7.Connection.Close()
 

Source File: d:\inetpub\wwwroot\tibroik.net\admin2\serier.aspx.vb    Line: 144

Har du någon annan lättare/bättre lösning får du gärna visa den

PatrikBMedlem sedan mars 20002 836 inlägg
#6

När du väl har öppnat din connection så får du inte stänga och öppna den igen som du gör när du kör din ExecuteNonQuery

Skippa alla Open och Close i dina loopar. Väl stängd så tappar du hela datareadern då din objconn står som grund för alla dina datareaders och command-object

Har ingen lösning direkt i bakfickan, men detta sätt låter mycket knöligt.

Tex. Hur skapas alla lag? Genom ett eller flera form-fält? Är det alltid lika många lag som skapas? Varför vill du stoppa in alla spelare från Tibro ID i tabellen statistik? Ska inte det göras när en spelare "har statistik" att visa typ gjorda mål, assist, utvisningar etc.?

Som du ser så finns det många andra frågor att ställa och få besvarade, finns säkert fler om du kommer med mer info om vad du vill ska göras och hur det ska fungera. Vad ska du ha allt detta till? är det ett spel, eller?

cya,
PatrikB

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#7

Lägger upp en bild på hur det ser ut när man skriver in serien

Anledningen till att jag vil lägga in spelarna är att statistiken kommer att uppdateras automatiskt när tränarna fyller i målskyttar och assist. Ett lag tex U-15 kan ha spelare som egentligen tillhör ett yngre lag eller ett äldre. Därför vill jag lägga till de spelare som ska spela i varje serie så att tränarna slipper välja mellan 100 spelare när dom ska fylla i målskyttarna.

Det är inget spel utan det är en sida gjord åt en hockeyklubb.
har fått klagomål på att det varit för jobbigt att skriva in all statistik. Det är därför jag vill göra på det här sättet.

bild på serierna
https://www.alindh.com/temp/serier.gif
och där man fyller i målskyttar
https://www.alindh.com/temp/matchfakta.gif

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#8

jag har löst det nu. Jag stoppade in spelarna i en arraylist om jag loopar in i tabellen statistik

Dim sign As String
        Dim objcmd5 As New OdbcCommand _
            ("SELECT Id from s_deltagande_lag where namn ='Tibro IK' and serie_ID=" & viewstate("serie") & "", objconn)
        objconn.Open()
        Dim dr2 As OdbcDataReader = objcmd5.ExecuteReader()

        If dr2.Read() = True Then
            id2 = dr2(0)
            viewstate("tik") = id2
            sign = "t"
        End If
        objconn.Close()
        If sign = "t" Then
            Dim objcmd6 As New OdbcCommand _
                ("SELECT Id,namn from trupper where lagID=" & viewstate("lag_id") & "", objconn)
            objconn.Open()
            Dim dr6 As OdbcDataReader = objcmd6.ExecuteReader()

            Dim j As Integer = 0
            While dr6.Read()
                Response.Write(j)
                Players.Insert(j, dr6("id"))
                j = j + 1
            End While
            Dim k As Integer
            For k = 0 To Players.Count - 1
                'Response.Write("dr6(id) " & dr6("namn"))
                Dim strsql6 As String = "insert into Statistik(SerieID,LagID,SpelarID) values (" & viewstate("serie") & "," & viewstate("tik") & "," & Players(k) & ")"
                'Response.Write(strsql6)
                'Response.End()
                Dim objcmd7 As New OdbcCommand(strsql6, objconn)
                objconn.Close()
                objcmd7.Connection.Open()
                objcmd7.ExecuteNonQuery()
                objcmd7.Connection.Close()

            Next

        End If

Det känns inte som om det här är det smidigaste sättet så om du kommer på något bättre får du gärna skriva det här

140 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)