前回,Visual Studioでデータベース・プログラミングができるようにSQL Server2005 Express EditionとSQL Server 2005 Management Studio Express(SSMSE)をWindows VistaのPCにインストールした(前回の記事はこちら)。こうしろうはインストールしただけで大阪に帰ってしまったが,今回から数回にわたって,C#2005によるデータベース・プログラミングを解説したいと思う。

 前回作成したSampDBデータベースのMembersを一覧表示する処理から作成してみる。一覧表示させるだけでも,方法は何種類かある。まず,コードを書かなくてもいい例から始めよう。

 データソースの追加で,データソース構成ウィザードを起動し,データベースSampDBを選択後,Membersテーブルにチェックを入れ,テーブルを選択する。

 データソースがプロジェクトに作成される。このときに,表示-クラスビュー(A)でクラスを表示させる。

 SampDBDataSetやSampDBDataSetTableAdaptersが作成されていることがわかる。データソースを追加すると,これらのクラスが自動作成されることを覚えておいてほしい。

 .NET2.0からは一覧表示と言えばDataGridViewを使うことが多いが,データソースからMembersテーブルをドラッグ&ドロップすることで,DataGridViewが自動的に作成される。

 表示専用にしたいので,AllowUserToAddRowsやAllowUserToDeleteRowsプロパティをFalseに,ReadOnlyプロパティをTrueにするなどして,ユーザーの操作を制限する。

 SelectionModeプロパティをFullRowSelectにすると,行単位にしかカーソルが動かなくなるのでそれらしくなる。項目名も日本語に変更して,DataGridViewの上の削除や追加のボタンも削除してしまう。

 これで一覧表示らしくなった。

-------------------------------------------------------------------
private void Form1_Load(object sender, EventArgs e)
{
// TODO: このコード行はデータを'sampDBDataSet.Members' テーブルに
// 読み込みます。必要に応じて移動、または削除をしてください。
this.membersTableAdapter.Fill(this.sampDBDataSet.Members);
}
-------------------------------------------------------------------

 自動生成されたフォーム・ロード時のコードを見ると,先ほどのクラスが使われていることがわかる。

 データソースを追加すると,型付きのクラスが作成されるので,クラスを利用するコードはシンプルになる。型付きのクラスの利用方法は次回以降に回すことにして,DataAdapterやDataSetクラスを型なしでコードから利用する方法を次に説明したい。

 フォームを追加し,ツールボックスからDataGridViewを追加する。プロパティは項目名を除き,先ほどのフォームと同様に設定する。そして,フォームにコードを追加する。

-------------------------------------------------------------------
using System.Data.SqlClient;
-------------------------------------------------------------------

 まず,他のusingに続けてSqlDataAdapterやDataTableが存在するネームスペースをインポートする。フォーム・ロード時の処理にはDataGridViewにレコードを設定するコードを書く。

-------------------------------------------------------------------
private void Form2_Load(object sender, EventArgs e)
{
string sql = "SELECT MemberNo as NO, Name as 名前,Telephone as 電話番号,Address as 住所 FROM Members";
SqlConnection cn = new SqlConnection();
cn.ConnectionString = "Data Source=(local)\\SQLEXPRESS;"
+ "Initial Catalog=SampDB;"
+ "Integrated Security=True;Pooling=False";
SqlDataAdapter da = new SqlDataAdapter(sql, cn);
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;
}
-------------------------------------------------------------------

sqlに代入するのは,Membersテーブルから全レコードを取得するSELECT文だ。項目名が日本語で表示されるように,as句で別名を付けている。

 SqlConnection cnに接続文字列を設定する。Integrated Security=Trueは,接続にWindows認証を使うことを示す。new SqlDataAdapter(sql, cn)でSQL文と接続オブジェクトを引数にDataAdapterクラスのインスタンスを作成する。続いて,new DataTable( )でDataTableクラスのインスタンスdtを作成する。

 DataAdapter のFillメソッドがdtを満たし,dataGridView1.DataSourceにdtを設定すればレコードが表示される。

 はじめてDataAdapterを使う人は,データベースへの接続や切断を行うコードがないことに違和感があるかもしれないが,接続がなければ,Fillメソッドが自動的に接続,切断をしてくれる。
 
 最後に自分のコードでデータベースに接続,切断するサンプルを紹介する。

こんどはフォームにListBoxを追加する。前のフォームと同様にSystem.Data.SqlClientをインポートする。

-------------------------------------------------------------------
private void Form3_Load(object sender, EventArgs e)
{
string sql = "SELECT * FROM Members";
SqlConnection cn = new SqlConnection();
cn.ConnectionString = "Data Source=(local)\\SQLEXPRESS;"
+ "Initial Catalog=SampDB;"
+ "Integrated Security=True;Pooling=False";
cn.Open();
SqlCommand cmd = new SqlCommand(sql, cn);
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
listBox1.Items.Add(
reader.GetString(0) + reader.GetString(1) +
reader.GetString(2) + reader.GetString(3));
}

reader.Close();
cn.Close();
}
-------------------------------------------------------------------

 この例はDataAdapterやDataTableを使わない,どちらかと言うと伝統的な書き方だ。SqlCommandとSqlDataReaderクラスを使ってレコードを読み込み,ListBoxに追加していくコードだ。 テーブルの項目がすべて文字列型なのでreader.GetStringで値を読み出している。

 cn.Open( ),cn.Close( )でデータベース接続と切断をしている。大量のレコードを扱うとき,データを読むだけならDataReaderを使った方が速いので,この方法も覚えておきたい。