Liste déroulante non contractuelle avec sqldatareader

J’ai un formulaire avec une collection d’environ cinq listes déroulantes. J’ai ma requête comme suit.

ssortingng sql = "SELECT a.clientID ,a.[cname],b.bid,b.[bname],c.contactID, c.[name] FROM " + " dbo.[CLIENT] AS a INNER JOIN dbo.[BRANCH] AS b " + "ON a.clientID = b.clientID JOIN dbo.[CONTACT] AS " + " c ON b.bid = c.bid ORDER BY a.clientID "; 

J’ai ensuite suivi et lié mon menu déroulant individuellement à leurs colonnes respectives comme suit.

  SqlCommand cmd = new SqlCommand(sql, connection); cmd.CommandType = CommandType.Text; SqlDataReader reader = cmd.ExecuteReader(); drClient.Enabled = true; drClient.DataSource = reader; drClient.DataTextField = "cname"; drClient.DataValueField = "clientID"; drClient.DataBind(); drBranch.Enabled = true; drBranch.DataSource = reader; drBranch.DataTextField = "bname"; drBranch.DataValueField = "bid"; drBranch.DataBind(); drContact.Enabled = true; drContact.DataSource = reader; drContact.DataTextField = "name"; drContact.DataValueField = "contactID"; drContact.DataBind(); drEmail.Enabled = true; drEmail.DataSource = reader; drEmail.DataTextField = "name"; drEmail.DataValueField = "contactID"; drEmail.DataBind(); drFax.Enabled = true; drFax.DataSource = reader; drFax.DataValueField = "contactID"; drFax.DataTextField = "name"; drFax.DataBind(); 

quand je lance ceci, seulement la première liste déroulante se lie avec succès. Le rest ne le fait pas. J’essaie aussi de parcourir le lecteur en ajoutant

 while(reader.read()) { then my bindings } 

ce qui précède échoue également. Je pensais faire une boucle comme ci-dessous.

 while(read.HasRows) { } 

ça échoue encore. Je suis confus, toute aide serait appréciée. Merci

Reader est en readonly et en avant uniquement, c’est pourquoi seuls les premiers dropdonw sont remplis de données et que les autres sont vides. Vous pouvez utiliser datset ou Datatable pour le même problème.

  SqlCommand cmd = new SqlCommand(sql, connection); cmd.CommandType = CommandType.Text; Dataset dsresult = cmd.ExecuteDataset(); If(dsResult !=null) { if(dsResult.Rows.count>0) { drClient.Enabled = true; drClient.DataSource = dsResult.Tables[0] ; drClient.DataTextField = Convert.ToSsortingng(ds.Tables[0].Columns["cname"]); drClient.DataValueField = ds.Tables[0].Columns["clientID"] ; drClient.DataBind(); } } 

Datareader est une architecture connectée qui nécessite une connexion continue et extrait une ligne à la fois en mode direct. Il est donc préférable d’utiliser un dataset qui utilise une disconnected architecture et peut être utilisé pour récupérer des données plusieurs fois.

Cela semble évident problème postback.

Liez votre liste déroulante! Postback.

Par exemple.

 if(!IsPostBack) { populateDdl(); } 

Soit vous devrez faire un lecteur séparé pour chaque reliure

ou vous pouvez le faire en remplissant une date (je préférerais cela). Comme,

 DataTable dt = new DataTable(); using (SqlDataAdapter a = new SqlDataAdapter(sql, connection)) { a.Fill(dt); } drClient.DataSource = dt; drClient.DataBind(); drBranch.DataSource = dt; drBranch.DataBind(); drContact.DataSource = dt; drContact.DataBind(); drFax.DataSource = dt; drFax.DataBind(); 

Vous avez le choix entre réexécuter / recharger le lecteur, créer des lecteurs distincts ou, mieux encore, remplir un fichier de données pour pouvoir le réutiliser.