Diferencia entre SqlDataReader.Read y SqlDataReader.NextResult

¿Cuál es la principal diferencia entre estos dos methods? En el website de msdn se explica a continuación, pero no lo entiendo.

Read Avanza el SqlDataReader al siguiente logging. (Invalida a DbDataReader.Read ())

NextResult Avanza el lector de datos al siguiente resultado al leer los resultados de las instrucciones de Transact-SQL por lotes. (Invalida a dbDataReader.NextResult ()).

Si su instrucción / process está devolviendo sets de resultados múltiples, por ejemplo, si tiene dos instrucciones de select en un solo object de Command , obtendrá dos sets de resultados.

  • NextResult se usa para moverse entre sets de resultados.
  • Read se usa para avanzar en los loggings de un único set de resultados.

Considere el siguiente ejemplo:

Si tienes un proc cuyo cuerpo principal es como:

 .... Proc start SELECT Name,Address FROM Table1 SELECT ID,Department FROM Table2 -- Proc End 

Ejecutar el process anterior produciría dos sets de resultados. Uno para Table1 o primera instrucción de selección y otra para la siguiente statement de select .

Por defecto, el primer set de resultados estaría disponible para Read . Si desea pasar al segundo set de resultados, necesitará NextResult .

Ver: Recuperación de datos usando un lector de datos

Código de ejemplo del mismo enlace : recuperación de sets de resultados múltiples utilizando NextResult

 static void RetrieveMultipleResults(SqlConnection connection) { using (connection) { SqlCommand command = new SqlCommand( "SELECT CategoryID, CategoryName FROM dbo.Categories;" + "SELECT EmployeeID, LastName FROM dbo.Employees", connection); connection.Open(); SqlDataReader reader = command.ExecuteReader(); while (reader.HasRows) { Console.WriteLine("\t{0}\t{1}", reader.GetName(0), reader.GetName(1)); while (reader.Read()) { Console.WriteLine("\t{0}\t{1}", reader.GetInt32(0), reader.GetString(1)); } reader.NextResult(); } } } 

No es estrictamente una respuesta a esta pregunta, pero si utiliza el método DataTable.Load para consumir datos del lector en lugar de Reader.Read, tenga en count que una vez que se haya completado el método Load, el lector se colocará al comienzo del siguiente set de resultados, de modo no debe llamar al método NextResult; de lo contrario, omitirá el siguiente resultado.

Un simple bucle en Reader.HasRows alnetworkingedor de una llamada DataTable.Load es todo lo que necesita para procesar posibles resultados múltiples en este escenario.