webForumDet fria alternativet

Fylla dropdownlist

10 svar · 228 visningar · startad av andreas_lindh

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#1

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

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"))
andreas_lindhMedlem sedan jan. 20011 140 inlägg
#3

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
juventus1Medlem sedan dec. 2000399 inlägg
#4

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
andreas_lindhMedlem sedan jan. 20011 140 inlägg
#5

tyvärr fungerade inte det heller. Det blir samma fel.

juventus1Medlem sedan dec. 2000399 inlägg
#6

Vilka är rad 59-63? Jag kan inte hitta någon kod som motsvarar den i felmeddelandet. (se mitt förra svar)

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#7
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
juventus1Medlem sedan dec. 2000399 inlägg
#8

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
andreas_lindhMedlem sedan jan. 20011 140 inlägg
#9

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

juventus1Medlem sedan dec. 2000399 inlägg
#10

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

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#11

Tack. Nu fungerar det perfekt :)

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