これら2つの方法の主な違いは何ですか? msdn Webサイトでは、以下のように説明されていますが、わかりません。
Read
SqlDataReaderを次のレコードに進めます。 (DbDataReader.Read()をオーバーライドします。)
NextResult
バッチTransact-SQLステートメントの結果を読み取るときに、データリーダーを次の結果に進めます。 (dbDataReader.NextResult()をオーバーライドします。)
ステートメント/プロシージャが複数の結果セットを返す場合、たとえば、単一の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
が必要です。
同じ 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();
}
}
}
厳密にこの質問に対する答えではありませんが、Reader.ReadではなくDataTable.Loadメソッドを使用してリーダーからデータを消費する場合、Loadメソッドが完了した後、リーダーは次の結果セットの先頭に配置されることに注意してくださいNextResultメソッドを呼び出さないでください。そうしないと、次の結果セットをスキップします。
このシナリオで潜在的な複数の結果セットを処理するために必要なのは、DataTable.Load呼び出しの周りのReader.HasRowsの単純なループだけです。