read executereader example data c# asp.net .net sqldatareader datareader

executereader - read data sqldatareader c#



Tabla de mĂșltiplos en DataReader (2)

Normalmente uso DataSet porque es muy flexible. Recientemente me asignaron una tarea de optimización de código. Para reducir los accesos a la base de datos, estoy cambiando dos consultas en un solo procedimiento. una consulta devuelve el count y la otra devuelve los actual data . Es decir, Mi stored procedure devuelve dos tablas. Ahora, sé cómo leer ambas tablas usando DataSets , pero necesito leer ambas tablas usando DataReader . En busca de eso encontré This .

Sigo el artículo y escribí mi código así:

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

Pero estoy recibiendo una excepción en dt.NextResult. La excepción es:

Invalid attempt to call NextResult when reader is closed.

También intenté hacer un error por encima de Google, pero aún no puedo resolver el problema. Cualquier ayuda será muy apreciada. Necesito leer varias tablas usando datareader , ¿es esto posible?


He intentado reproducir este problema (también porque no he usado varias tablas en un lector antes). Pero funciona como se esperaba, por lo tanto, asumo que ha omitido el código relacionado.

Aquí está mi código de prueba:

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]); } } } } }


Intente esto porque esto cerrará la conexión, el lector de datos y el comando una vez que la tarea se haya superado, de modo que esto no dará una excepción de cierre a datareader

También verifique así if(reader.NextResult()) para verificar que haya el siguiente resultado,

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"); } } } } }