web-dev-qa-db-ja.com

SqlDataReader.ReadとSqlDataReader.NextResultの違い

これら2つの方法の主な違いは何ですか? msdn Webサイトでは、以下のように説明されていますが、わかりません。

Read SqlDataReaderを次のレコードに進めます。 (DbDataReader.Read()をオーバーライドします。)

NextResultバッチTransact-SQLステートメントの結果を読み取るときに、データリーダーを次の結果に進めます。 (dbDataReader.NextResult()をオーバーライドします。)

32
Ozkan

ステートメント/プロシージャが複数の結果セットを返す場合、たとえば、単一のselectオブジェクトにCommandステートメントが2つある場合、2つの結果セットが返されます。

  • NextResultは、結果セット間を移動するために使用されます。
  • Readは、単一の結果セットのレコードを前方に移動するために使用されます。

次の例を考えてみましょう。

本体が次のようなprocがある場合:

.... Proc start

SELECT Name,Address FROM Table1

SELECT ID,Department FROM Table2

-- Proc End

上記のプロシージャを実行すると、2つの結果セットが生成されます。 Table1または次のselectステートメントの最初のselectステートメントとその他。

デフォルトでは、最初の結果セットはReadで利用できます。 2番目の結果セットに移動する場合は、NextResultが必要です。

参照: 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();
        }
    }
}
46
Habib

厳密にこの質問に対する答えではありませんが、Reader.ReadではなくDataTable.Loadメソッドを使用してリーダーからデータを消費する場合、Loadメソッドが完了した後、リーダーは次の結果セットの先頭に配置されることに注意してくださいNextResultメソッドを呼び出さないでください。そうしないと、次の結果セットをスキップします。

このシナリオで潜在的な複数の結果セットを処理するために必要なのは、DataTable.Load呼び出しの周りのReader.HasRowsの単純なループだけです。

1
Bob B