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

时间:2014-11-20 16:21:13

标签: c# sql ado.net

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

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

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

2 个答案:

答案 0 :(得分:40)

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

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

考虑以下示例:

如果你的主体是这样的一个过程:

.... Proc start

SELECT Name,Address FROM Table1

SELECT ID,Department FROM Table2

-- Proc End

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

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

请参阅:Retrieving Data Using a DataReader

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

答案 1 :(得分:1)

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

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