回答:
一方、それは:
代償:
したがって、実際にはそれはあなたが何をしているのかに依存しますが、私はデータセットでのみサポートされる何かが必要になるまでDataReaderを好む傾向があります。SqlDataReaderは、読み取り専用グリッドにバインドする一般的なデータアクセスの場合に最適です。
詳しくは、Microsoftの公式ドキュメントをご覧ください。
while (reader.Read())ループ内のIDataRecordとしてDataReaderキャストを返します。
その答えはかなり広い可能性があります。
基本的に、私が通常使用する決定に影響を与える私にとっての主な違いは、SQLDataReaderを使用すると、データベースからデータを「ストリーミング」することです。SQLDataAdapterを使用すると、データベースからデータを抽出して、それ自体をさらに照会できるオブジェクトにしたり、CRUD操作を実行したりできます。
データのストリームを使用すると、SQLDataReaderの方がはるかに高速ですが、一度に1つのレコードしか処理できません。SQLDataAdapterを使用すると、データベースからクエリに一致する行の完全なコレクションを取得して、コードを操作/パススルーできます。
警告: SQLDataReaderを使用している場合は、ALWAYS、ALWAYS、ALWAYSを使用して、SQLDataReaderで接続を開いたままにしているため、接続を閉じるための適切なコードを必ず記述してください。これを行わない場合、または結果の処理中にエラーが発生した場合に接続を閉じる適切なエラー処理を行うと、アプリケーションで接続リークが発生します。
私のVBを許してください。ただし、これはSqlDataReaderを使用するときに必要なコードの最小量です。
Using cn As New SqlConnection("..."), _
cmd As New SqlCommand("...", cn)
cn.Open()
Using rdr As SqlDataReader = cmd.ExecuteReader()
While rdr.Read()
''# ...
End While
End Using
End Using
同等のC#:
using (var cn = new SqlConnection("..."))
using (var cmd = new SqlCommand("..."))
{
cn.Open();
using(var rdr = cmd.ExecuteReader())
{
while(rdr.Read())
{
//...
}
}
}
SqlDataAdapterは通常、DataSetまたはDataTableに入力するために使用されるため、接続が閉じられた後(切断されたアクセス)にデータにアクセスできます。
SqlDataReaderは高速転送専用の接続カーソルであり、DataSet / DataTableへの入力よりも一般的に高速になる傾向があります。
さらに、SqlDataReaderを使用すると、一度に1レコードずつデータを処理し、メモリにデータを保持しません。明らかに、DataTableまたはDataSetを使用すると、メモリ割り当てのオーバーヘッドが発生します。
データをメモリに保持する必要がない場合は、レンダリングのみのために、SqlDataReaderを使用してください。切断された方法でデータを処理する場合は、DataAdapterを選択して、DataSetまたはDataTableのいずれかを入力します。
データベースからメモリ内のDataSet / DataTableを作成する場合は、SqlDataAdapterを使用します。その後、接続を閉じる/破棄し、メモリ内でデータテーブル/セットを渡す柔軟性があります。次に、データを操作し、InsertCommand / UpdateCommandと組み合わせてデータアダプターを使用してDBに永続化します。
ビジネスロジックの周りにデータを渡すなどの柔軟性を必要とせずに、高速で低メモリのフットプリントデータアクセスが必要な場合は、SqlDataReaderを使用します。これは、一度にすべてのデータをメモリにロードするわけではないため、大量のデータをすばやくメモリ使用量が少ない状態で取得する場合に最適です。SqlDataAdapterアプローチでは、DataSet / DataTableにすべてのデータが入力されるため、多くの行と列があり、保持するには多くのメモリが必要になります。