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 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
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 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
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 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
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
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