SqlDataReader と SqlDataAdapter の違いと使い分け

SqlDataReader と SqlDataAdapter の違い

SQL Server データベースからデータを取得する際には、SqlClient の SqlDataReader クラスか SqlDataAdapter クラスが良く使われます。

ここでは、SqlDataReader と SqlDataAdapter の違いについて見てみましょう。


SqlDataReader クラス

SqlDataReader と SqlDataAdapter の違いと使い分け 1

SqlDataReader は SQL Server データベースから取得したレコードを前から順番に読んで行くのに使われます。

1 行 1 行処理するので、SqlDataAdapter と比べて速く、メモリーの使用量も少なくてすみます。

データを全て取得するのを待たなくても取得したレコードを使って他の処理をすることができます。

ですが、SqlDataReader が使われている間はコネクションは open のままの状態になります。

その SqlDataReader を close するまで、同じコネクションで他のデータを取得したりすることができませんので、使い終わったらすぐに close しましょう。


SqlDataAdapter クラス

SqlDataReader と SqlDataAdapter の違いと使い分け 2

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 と SqlDataAdapter の違いと使い分け 3

私のルールとしては、SqlDataReader で読み終わった後に using ステートメントのスコープ内で他の処理をしないのであれば、すぐに Close されるので、明示的に Close する必要はないと思っています。

© 2024 C# 入門