Jag försöker fylla en dropdownlist med värden från en databas men får det inte att fungera.
Dim objcmd As New OleDbCommand _
("SELECT lagid_a,lagid_b from matcher where id=" & m_id & "", objconn)
Dim dr As OleDbDataReader
objconn.Open()
dr = objcmd.ExecuteReader
If dr.Read() Then
If dplLag.SelectedItem.Text = "A" Then
Dim objcmd1 As New OleDbDataAdapter _
("select * from trupper where lag_id=" & dr("lagid_a") & "", objconn)
Dim ds1 As DataSet = New DataSet()
objcmd1.Fill(ds1, "matchprotokoll")
For i = 1 To ds1.Tables("matchprotokoll").Rows.Count
dplSpelare.Items(i).Text = ds1.Tables("matchprotokoll").Rows(0)("nummer")
dplSpelare.Items(i).Value = ds1.Tables("matchprotokoll").Rows(0)("id")
Next
Else
Dim objcmd1 As New OleDbDataAdapter _
("select * from trupper where lag_id=" & dr("lagid_b") & "", objconn)
Dim ds1 As DataSet = New DataSet()
objcmd1.Fill(ds1, "matchprotokoll")
For i = 1 To ds1.Tables("matchprotokoll").Rows.Count
dplSpelare.Items(i).Text = ds1.Tables("matchprotokoll").Rows(0)("nummer")
dplSpelare.Items(i).Value = ds1.Tables("matchprotokoll").Rows(0)("id")
Next
End If
End If
Felmeddelande
Exception Details: System.InvalidOperationException: There is already an open DataReader associated with this Connection which must be closed first.
Source Error:
Line 56:
Line 57: Dim ds1 As DataSet = New DataSet()
Line 58: objcmd1.Fill(ds1, "matchprotokoll")
Line 59: objconn.Close()
Line 60: For i = 1 To ds1.Tables("matchprotokoll").Rows.Count
Source File: h:\inetpub\wwwroot\cup\mphandelser.aspx.vb Line: 58
fredrikMedlem sedan dec. 19991 072 inlägg Eftersom du har en "DataReader" öppen som jobbar med det aktuella connection-objektet kan du inte använda connection-objektet igen utan att stänga "Readern" först.
Alternativet är alltså att använda ett nytt connection-objekt, typ:
dim objCmd1 as new OleDBDataAdapter("SELECT * FROM table", new OleDbConnection("CONN_STR"))
jag testade att göra så här
Dim objcmd As New OleDbCommand _
("SELECT lagid_a,lagid_b from matcher where id=" & m_id & "", objconn)
Dim dr As OleDbDataReader
objconn.Open()
dr = objcmd.ExecuteReader
If dr.Read() Then
If dplLag.SelectedItem.Text = "A" Then
Dim objcmd1 As New OleDbDataAdapter _
("select * from trupper where lag_id=" & dr("lagid_a") & "", objconn)
objconn.Close()
Dim ds1 As DataSet = New DataSet()
objcmd1.Fill(ds1, "matchprotokoll")
For i = 1 To ds1.Tables("matchprotokoll").Rows.Count
dplSpelare.Items(i).Text = ds1.Tables("matchprotokoll").Rows(0)("nummer")
dplSpelare.Items(i).Value = ds1.Tables("matchprotokoll").Rows(0)("id")
Next
objconn.Open()
Else
Dim objcmd1 As New OleDbDataAdapter _
("select * from trupper where lag_id=" & dr("lagid_b") & "", objconn)
objconn.Close()
Dim ds1 As DataSet = New DataSet()
objcmd1.Fill(ds1, "matchprotokoll")
For i = 1To ds1.Tables("matchprotokoll").Rows.Count
dplSpelare.Items(i).Text = ds1.Tables("matchprotokoll").Rows(0)("nummer")
dplSpelare.Items(i).Value = ds1.Tables("matchprotokoll").Rows(0)("id")
Next
objconn.Open()
End If
End If
Får ett nytt felmeddelande
Exception Details: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index
Source Error:
Line 59:
Line 60: For i = 0 To ds1.Tables("matchprotokoll").Rows.Count
Line 61: dplSpelare.Items(i).Text = ds1.Tables("matchprotokoll").Rows(0)("nummer")
Line 62: dplSpelare.Items(i).Value = ds1.Tables("matchprotokoll").Rows(0)("id")
Line 63: Next
Source File: h:\inetpub\wwwroot\cup\mphandelser.aspx.vb Line: 61
Koden du postade stämmer inte med felmeddelandet. Jag hittar iaf inte någon loop där du börjar med i = 0. Men koden som du har i felmeddelandet kan du fixa så här:
For i = 0 To ds1.Tables("matchprotokoll").Rows.Count - 1
dplSpelare.Items(i).Text = ds1.Tables("matchprotokoll").Rows(0)("nummer")
dplSpelare.Items(i).Value = ds1.Tables("matchprotokoll").Rows(0)("id")
Next
tyvärr fungerade inte det heller. Det blir samma fel.
Vilka är rad 59-63? Jag kan inte hitta någon kod som motsvarar den i felmeddelandet. (se mitt förra svar)
For i = 0 To ds1.Tables("matchprotokoll").Rows.Count - 1
dplSpelare.Items(i).Text = ds1.Tables("matchprotokoll").Rows(0)("nummer")
dplSpelare.Items(i).Value = ds1.Tables("matchprotokoll").Rows(0)("id")
Next
Men den koden finns inte med i det stora stycket du postade. Hursomhelst borde du loopa till efter antalet element i dblSpelare och inte i ds1. Jag ser inte vad dblSpelare är får något, men typ så här:
for i = 0 to dplSpelare.Items.Count - 1
dplSpelare.Items(i).Text = ds1.Tables("matchprotokoll").Rows(0)("nummer")
dplSpelare.Items(i).Value = ds1.Tables("matchprotokoll").Rows(0)("id")
next
Då blir det inga fel men det blir inte som jag vill ha det.
dplspelare är dropdownlisten den är deklarerad så här
Public dplSpelare As DropDownList
Sen har jag det här i aspx filen
<asp:dropdownlist id="dplSpelare" runat="server" width="35">
<asp:listitem></asp:listitem>
</asp:dropdownlist>
Jag vill att det ska bli lika många laternativ i dropdownlisten som det finns poster i databasen
Ok, då är jag med på det hela. Jag tror inte att du ens behöver loopa för att fixa det. Jag gör ett försök:
dplSpelare.DataSource = dr
dblSpelare.DataBind()
Sedan i din dropdownlist sätter du DataTextField="nummer"
DataValueField="id". Om det inte fungerar så läs lite här: http://www.dotnet247.com/247reference/a.aspx?u=http://www.orcsweb.com/articles/dropsql.asp
Tack. Nu fungerar det perfekt :)