データセットとデータアダプタについての概要はここまでだ。さっそくこれらを使用したプログラミングについて見ていこう。すでに述べたように、今回はこの2つを利用してデータベースからレコードを取得するプログラミングについて解説する。
まずデータアダプタであるSqlDataAdapterクラスのインスタンスを1つ作成する。コンストラクタにはオーバーロードされたいくつかのバージョンが用意されているが、ここではまず、2つの文字列をパラメータとしてとるコンストラクタを使用してみる。
string sqlStr = "SELECT pub_id, pub_name FROM publishers";
string connStr = "Server=(local)\\NetSDK;"
+ "Trusted_Connection=yes;"
+ "database=pubs";
SqlDataAdapter da = new SqlDataAdapter(sqlStr, connStr);
コンストラクタのパラメータである2つの文字列はそれぞれ、データベースへ接続するための接続文字列と、レコードを取得するためのselect文である。これらは.NETデータ・プロバイダを使用してレコード取得を行った第2回目での内容とまったく同じものだ。
指定したselect文は、次に述べるFillメソッドを実行したときに、データベース・サーバに対して送信されるSQLコマンドである。前節までを読んで、データアダプタではデータ取得先のテーブル名を指定するなどして、データセット内にそのコピーを作成するように思われた方がいるかもしれないが、そうではない。SqlDataAdapterクラスは、指定されたSQL文を実行し、その結果として得られたレコード(通常は複数のレコード)をテーブルの形でデータセット内に格納するのである。この処理を行うのがSqlDataAdapterクラスのFillメソッドだ。
Fillメソッドの呼び出しは、まず取得したレコードの格納場所となるDataSetクラスのインスタンスを作成しておき、それをパラメータとして呼び出すだけだ。
DataSet ds = new DataSet();
da.Fill(ds);
これによりSqlDataAdapterクラスのコンストラクタで指定しておいたselect文が実行され、それによって取得されたレコードがDataSetオブジェクトに読み込まれる。レコード取得に必要な記述はたったこれだけである。データアダプタを使うと、データベースをオープンしたり、クローズしたりする処理はまったく不要なのだ。
Fillメソッドは魔法のように便利なメソッドだが、データベース・アクセスに関しては前回までで解説した.NETデータ・プロバイダによるレコード取得の各手順を、Fillメソッドが機械的に行っているにすぎない。このことを認識しておくと、SqlDataAdapterクラスの各プロパティや各メソッドのパラメータの意味が把握しやすいと思われる。
レコードを取得するFillメソッドでは、SqlDataAdapterオブジェクトが実行時に内部で利用する.NETデータ・プロバイダの各オブジェクトの構造は次の図のようなイメージになる。
つまり、前述の2つの文字列をパラメータにとるコンストラクタを使用した場合、Fillメソッドの実行時には、接続文字列を基にSqlConnectionオブジェクトが作成され、SQL文を基にSqlCommandオブジェクトが作成される。そして接続がオープンされ、SqlDataReaderオブジェクトによりレコードが取得されながら、データセットにレコード(DataRowオブジェクト)が作成されていくといった感じだ。SqlDataReaderオブジェクトによりレコードが取得されるまでについては、第2回で詳しく解説している。
SqlDataAdapterオブジェクトが内部で利用するSqlCommandオブジェクトには、SqlDataAdapterクラスのSelectCommandプロパティからアクセスすることができる。また、SqlConnectionオブジェクトには、SqlCommandオブジェクトのConnectionプロパティからアクセスできるのは第2回で述べたとおりだ。
これらのプロパティを利用すれば、次のように事前に用意したオブジェクトを利用してSqlDataAdapterクラスを使用することもできる。
SqlConnection conn = new SqlConnection();
conn.ConnectionString = connStr;
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = sqlStr;
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataSet ds = new DataSet();
da.Fill(ds);
わざわざこのような記述をする必要はないが、ここで示したかったことは、Fillメソッドの実行時にはこういったさまざまな.NETデータ・プロバイダのオブジェクトが暗黙的にインスタンス化されているということだ。
Copyright© Digital Advantage Corp. All Rights Reserved.