“déjà un DataReader ouvert” exception avec imbriqué dans SqlDataReader ASP.NET
Je voulais utiliser imbriquée SqlDataReader dans le code ci-dessous mais je ne pouvais pas le faire.J'obtiens un "Système.InvalidOperationException: Il y a déjà un DataReader ouvert associé à cette Commande, qui doit être fermée d'abord" avec le code. Toutes Les Suggestions
c = "select user_Reps.rep_key,Officers.Officer_Name from user_Reps left join Officers on user_Reps.rep_key = Officers.Officer_code where [user_key]="+userCode;
if (c == null)
c = sr.ReadToEnd();
try
{
SqlCommand cmd = new SqlCommand(c, cn);
cn.Open();
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
SqlDataReader rdr2;
while (rdr.Read())
{
string c2 = "select Active_Clients.Clients_code,Active_Clients.Clients_Name,Active_Clients.Geo_code from Active_Clients where Active_Clients.[Officer_code] =" + rdr.GetValue(0) + " order by Clients_Name";
SqlCommand cmd2 = new SqlCommand(c2, cn);
rdr2 = cmd2.ExecuteReader(CommandBehavior.CloseConnection);
Dictionary<string, object> d = new Dictionary<string, object>(rdr.FieldCount+rdr2.FieldCount);
while (rdr2.Read())
{
int i = 0;
for (; i < rdr.FieldCount; i++)
{
d[rdr.GetName(i)] = rdr.GetValue(i);
}
for (; i < rdr2.FieldCount; i++)
{
d[rdr2.GetName(i)] = rdr2.GetValue(i);
}
list.Add(d);
}
rdr2.Close();
//list.Add(d);
}
JavaScriptSerializer j = new JavaScriptSerializer();
Response.Write(j.Serialize(list.ToArray()));
}
OriginalL'auteur Abdelwahed | 2012-06-01
Vous devez vous connecter pour publier un commentaire.
Le message d'erreur est un peu trompeur. Sauf si vous avez
MultipleActiveResultSets=True
dans votre chaîne de connexion, vous pouvez avoir plus qu'un seul ensemble de résultats par connexion. C'est encore le cas, si chaque lecteur de chapeau de son propre objet SqlCommand.grande.. d'accord avec kirk ..din sais pas à propos de ce ! Ty Mith
thx tellement... fonctionne très bien!
OriginalL'auteur Mithrandir
Vous ne pouvez pas avoir deux datareader ouverts sur la même connexion en même temps.
Commun des solutions à ce problème serait de charger le contenu de la première DataReader dans un DataTable ou une Liste<> avant l'ouverture de la prochaine DataReader. Vous pouvez également ouvrir une nouvelle connexion pour la requête imbriquée.
Modifier Ou, comme @Mithrandir mentionné précédemment, vous pouvez utiliser le MultipleActiveResultSets=true sur la chaîne de connexion.
OriginalL'auteur Steve Czetty
En supposant que c'est sur une version de sql server 2005 ou plus, permettant l'activation de Plusieurs jeux de résultats (MARS) devrait faire l'affaire je pense. http://msdn.microsoft.com/en-us/library/h32h3abf%28v=vs.80%29.aspx.
Si MARS n'est pas une option, une autre connexion doit être ouvert pour la deuxième commande.
OriginalL'auteur Me.Name