SqlDataReader と SqlDataAdapter の違いと使い分け
SqlDataReader と SqlDataAdapter の違い
SQL Server データベースからデータを取得する際には、SqlClient の SqlDataReader クラスか SqlDataAdapter クラスが良く使われます。
ここでは、SqlDataReader と SqlDataAdapter の違いについて見てみましょう。
SqlDataReader クラス
SqlDataReader は SQL Server データベースから取得したレコードを前から順番に読んで行くのに使われます。
1 行 1 行処理するので、SqlDataAdapter と比べて速く、メモリーの使用量も少なくてすみます。
データを全て取得するのを待たなくても取得したレコードを使って他の処理をすることができます。
ですが、SqlDataReader が使われている間はコネクションは open のままの状態になります。
その SqlDataReader を close するまで、同じコネクションで他のデータを取得したりすることができませんので、使い終わったらすぐに close しましょう。
SqlDataAdapter クラス
SqlDataAdapter の Fill メソッドを使うと、SQL Server から送られてきたデータをがばっと DataSet や DataTable に保存することができます。
データを全て取得し終わるまで他の処理はできません。
処理にオーバーヘッドがあるので、SqlDataReader よりもメモリを使います。
私は普段使わないですが、SqlDataAdapter のメソッドを使って、データベースへデータを保存することも可能です。
SqlDataAdapter の Fill メソッドは、コネクションが close の状態で呼ばれた時は、コネクションを open して、データを取得して、close します。 コネクションが open の状態で呼ばれた時は、データを取得した後、そのまま open にしておきます。
SqlDataReader と SqlDataAdapter の使い分け
SqlDataReader と SqlDataAdapter の使い分けですが、上記の違いをふまえて、状況に応じて使えばよいと思います。
データベースで取得したデータを DataSet や DataTable に保持して、その後の処理を行いたいような時は、SqlDataAdapter を使うのが便利だと思います。
前から順番に読んで処理していくだけで良かったり、DataSet や DataTable に取得したデータを保存する必要がないような時は SqlDataReader のほうが速くて良いと思います。
SqlDataReader の Close について
先ほど書いたように、SqlDataReader は使い終わったらできるだけ早く close したほうが良いです。
SqlConnection や SqlDataReader は using にしておかないと、Exception でコードパスが飛んだ時に、Close し忘れる可能性がでてきてしまいますので、using を使いましょう。
SqlDataReader.Close メソッドですが、 マイクソロフトのドキュメントを見ると using ステートメントを使っていても明示的に Close しているようです。
私のルールとしては、SqlDataReader で読み終わった後に using ステートメントのスコープ内で他の処理をしないのであれば、すぐに Close されるので、明示的に Close する必要はないと思っています。