■pubsデータベースの読み取りプログラム
以上でプログラムからselect文を実行し、結果を表示するためのパーツは揃った。ここまでに示したコードの断片をつなぎ合わせた実行可能なプログラムは次のようになる。このサンプル・プログラムは、pubsデータベースのpublishersテーブルから、pub_idカラムとpub_nameカラムの値を取得し、それを画面に表示する。
// reader.cs
using System;
using System.Data.SqlClient;
class Reader {
public static void Main() {
string connStr = "Server=(local)\\NetSDK;"
+ "Trusted_Connection=yes;"
+ "database=pubs";
string sqlStr = "SELECT pub_id, pub_name FROM publishers";
SqlConnection conn = new SqlConnection(connStr);
SqlCommand cmd = new SqlCommand(sqlStr, conn);
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read()) {
Console.Write("{0},{1}\n", dr["pub_id"], dr["pub_name"]);
}
dr.Close();
conn.Close();
}
}
// コンパイル方法:csc reader.cs
このプログラムをコンパイルし、実行すると次のような結果になるはずだ。
いま示したreader.csは、本連載では初めてのプログラムとなるため、もう少し詳しく見ておこう。
このプログラムでは、次のようにしてコンストラクタで必要なデータをすべて指定し、各オブジェクトを作成していた。
SqlConnection conn = new SqlConnection(connStr);
SqlCommand cmd = new SqlCommand(sqlStr, conn);
これは、次のように、パラメータを取らないコンストラクタを使用して“素”のオブジェクトだけをまず作成しておき、後で必要なデータを対応するプロパティから設定しても同じだ。
SqlConnection conn = new SqlConnection();
conn.ConnectionString = connStr;
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = sqlStr;
あるいは、SqlConnectionクラスにあるCreateCommandメソッドを利用して、次のように記述することもできる。
SqlConnection conn = new SqlConnection(connStr);
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText =sqlStr;
CreateCommandメソッドは、SqlConnectionオブジェクトをセットしたSqlCommandオブジェクトを作成してくれるため、これに関する記述を省略することができる。
同じ内容を記述するのにも、こういったたくさんのバリエーションがあり得るということを覚えておいていただきたい。どの記述方法が優れているかは、恐らく人それぞれだ。
通常の開発プロジェクトでは、システムで使用するデータベース製品は早い段階で決まっているはずなので不要かもしれないが、オブジェクトの「インターフェイスへのキャスト」を利用して、データ・プロバイダ固有クラスの使用を最小限に抑えたコーディングも可能だ。
「■.NETデータ・プロバイダの定義」で述べたように、例えばSqlConnectionクラスはIDbConnectionインターフェイスを実装しているので、SqlConnectionオブジェクトはそのままIDbConnection型へとキャストすることができる。つまり、
SqlConnection conn = new SqlConnection(connStr);
は、次のように記述でき、
IDbConnection conn = new SqlConnection(connStr);
変数connを通じて、「conn.CreateCommand();」のようにSqlConnectionクラスのメソッドを呼び出すことができる。
このインターフェイスへのキャストを最大限に利用して、先ほどのサンプル・プログラムreader.csは次のように書き直すことができる。
// ireader.cs
using System;
using System.Data;
using System.Data.SqlClient;
class ReaderByInterface {
public static void Main() {
string connStr = "Server=(local)\\NetSDK;"
+ "Trusted_Connection=yes;"
+ "database=pubs";
string sqlStr = "SELECT pub_id, pub_name FROM publishers";
IDbConnection conn = new SqlConnection(connStr);
IDbCommand cmd = conn.CreateCommand();
cmd.CommandText = sqlStr;
conn.Open();
IDataReader dr = cmd.ExecuteReader();
while (dr.Read()) {
Console.Write("{0},{1}\n", dr["pub_id"], dr["pub_name"]);
}
dr.Close();
conn.Close();
}
}
// コンパイル方法:csc ireader.cs
リストを見て分かるように、SQL Server用の.NETデータ・プロバイダ固有のクラスは、SqlConnectionクラスだけだ。こうしておけば、例えば、アクセス対象となるデータベース製品をSQL ServerからMicrosoft Accessに変更する場合でも、SqlConnectionをOleDbConnectionと書き換えるだけでよい(もちろん使用する名前空間と、接続文字列は修正する必要がある)。
以上、今回は.NETデータ・プロバイダと、それを使用したselect文の実行について解説を行った。次回は、今回のレコードの取得に引き続き、.NETデータ・プロバイダを使用したレコードの挿入・更新・削除などから解説する予定である。
Copyright© Digital Advantage Corp. All Rights Reserved.