SqlDataReader.Read和SqlDataReader.NextResult之间的区别

这两种方法的主要区别是什么? 在msdn网站上,它解释如下,但我不明白。

Read将SqlDataReader推进到下一条记录。 (重写DbDataReader.Read()。)

NextResult在读取批处理Transact-SQL语句的结果时,将数据读取器NextResult到下一个结果。 (重写dbDataReader.NextResult()。)

如果您的语句/ proc返回多个结果集,例如,如果在单个Command对象中有两个select语句,那么您将返回两个结果集。

  • NextResult用于在结果集之间移动。
  • Read用于在单个结果集的记录中前进。

请考虑以下示例:

如果你有一个主体如下的过程:

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

执行上述proc将产生两个结果集。 一个用于Table1或第一个选择语句,另一个用于下一个select语句。

默认情况下,第一个结果集可用于Read 。 如果要移动到第二个结果集,则需要NextResult

请参阅: 使用DataReader检索数据

示例来自同一链接的代码:使用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(); } } } 

不严格地回答这个问题但是如果你使用DataTable.Load方法来使用读者而不是Reader的数据。请注意,在Load方法完成之后,读者现在被置于下一个结果集的开头,所以你不应该调用NextResult方法,否则你将跳过下一个结果集。

在DataTable.Load调用周围的Reader.HasRows上的一个简单循环就是在这种情况下处理潜在的多个结果集所需的全部内容。