Table multiple dans DataReader

J’ai normalement utilisé DataSet car il est très flexible. Récemment, je suis affecté à la tâche d’optimisation du code. Pour réduire les hits dans la firebase database, je modifie deux requêtes en une seule procédure. une requête renvoie le count et l’autre renvoie les actual data . C’est-à-dire que ma stored procedure renvoie deux tables. Maintenant, je sais lire les deux tables en utilisant DataSets , mais je dois lire les deux tables en utilisant DataReader . A la recherche de cela j’ai trouvé ceci .

Je suis l’article et écrit mon code comme ceci:

 dr = cmd.ExecuteReader(); while (dr.Read()) { } if (dr.NextResult()) // this line throws exception { while (dr.Read()) { 

Mais je reçois une exception à dt.NextResult. L’exception est:

 Invalid attempt to call NextResult when reader is closed. 

J’ai également essayé de Google au-dessus de l’erreur, mais toujours pas en mesure de résoudre le problème. Toute aide sera très appréciée. J’ai besoin de lire plusieurs tables en utilisant datareader , est-ce possible?

Essayez ceci car cela fermera la connexion, le lecteur de données et la commande une fois que la tâche sera terminée, afin que cela ne donne pas d’exception à la fermeture de la datareader

Vérifiez aussi comme ceci if(reader.NextResult()) pour vérifier qu’il y a un résultat suivant,

 using (SqlConnection connection = new SqlConnection("connection ssortingng here")) { using (SqlCommand command = new SqlCommand ("SELECT Column1 FROM Table1; SELECT Column2 FROM Table2", connection)) { connection.Open(); using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { MessageBox.Show(reader.GetSsortingng(0), "Table1.Column1"); } if(reader.NextResult()) { while (reader.Read()) { MessageBox.Show(reader.GetSsortingng(0), "Table2.Column2"); } } } } } 

J’ai essayé de reproduire ce problème (aussi parce que je n’ai pas utilisé plusieurs tables dans un lecteur auparavant). Mais cela fonctionne comme prévu, donc je suppose que vous avez omis le code correspondant.

Voici mon code de test:

 using (var con = new SqlConnection(Properties.Settings.Default.ConnectionSsortingng)) { using (var cmd = new SqlCommand("SELECT TOP 10 * FROM tabData; SELECT TOP 10 * FROM tabDataDetail;", con)) { int rowCount = 0; con.Open(); using (IDataReader rdr = cmd.ExecuteReader()) { while (rdr.Read()) { Ssortingng object1 = Ssortingng.Format("Object 1 in Row {0}: '{1}'", ++rowCount, rdr[0]); } if (rdr.NextResult()) { rowCount = 0; while (rdr.Read()) { Ssortingng object1 = Ssortingng.Format("Object 1 in Row {0}: '{1}'", ++rowCount, rdr[0]); } } } } }