Tabella Multipli in DataReader

Di solito ho usato DataSet perché è molto flessibile. Recentemente mi è stata assegnata l’attività di ottimizzazione del codice. Per ridurre gli accessi al database, sto cambiando due query in un’unica procedura. una Query restituisce il count e l’altro restituisce i actual data . Cioè, la mia stored procedure restituisce due tabelle. Ora so come leggere entrambe le tabelle usando DataSets , ma ho bisogno di leggere entrambe le tabelle usando DataReader . Alla ricerca di ciò ho trovato questo .

Seguo l’articolo e ho scritto il mio codice in questo modo:

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

Ma sto ottenendo un’eccezione a dt.NextResult. L’eccezione è:

 Invalid attempt to call NextResult when reader is closed. 

Ho anche provato a Google sopra l’errore, ma non sono ancora riuscito a risolvere il problema. Qualsiasi aiuto sarà molto apprezzato. Ho bisogno di leggere più tabelle usando datareader , è ansible?

Prova questo perché questo chiuderà la connessione, il lettore di dati e il comando una volta che l’attività sarà terminata, in modo che questo non possa dare a datareader una stretta eccezione

Controlla anche in questo modo if(reader.NextResult()) verifica che ci sia il risultato successivo,

 using (SqlConnection connection = new SqlConnection("connection string 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.GetString(0), "Table1.Column1"); } if(reader.NextResult()) { while (reader.Read()) { MessageBox.Show(reader.GetString(0), "Table2.Column2"); } } } } } 

Ho provato a riprodurre questo problema (anche perché non ho usato più tabelle in un lettore prima). Ma funziona come previsto, quindi presumo che tu abbia omesso il codice relativo.

Ecco il mio codice di prova:

 using (var con = new SqlConnection(Properties.Settings.Default.ConnectionString)) { 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()) { String object1 = String.Format("Object 1 in Row {0}: '{1}'", ++rowCount, rdr[0]); } if (rdr.NextResult()) { rowCount = 0; while (rdr.Read()) { String object1 = String.Format("Object 1 in Row {0}: '{1}'", ++rowCount, rdr[0]); } } } } }