Visual Studio(VS)2005では,.NETプログラミングのベースとなる .NET Frameworkのバージョンが2.0となり,データベース・アクセス機能であるADO .NETも,1.1から2.0へと機能拡張しています。これによって,データベース・アプリケーションの開発スタイルがどう変わるのかが気になる方は多いでしょう。実用的なアプリケーションを作るのにデータベース・プログラミングは欠かせませんが,米Microsoftはこれまでに何度もデータベースのアクセス手法を変更しており,多くの開発者が様々な影響を受けてきたからです。

 そこでここでは,実際にデータベース・アプリケーションを作成しながら,VS 2005のデータベース関連の新機能を解説したいと思います。開発には,マイクロソフトが提供しているVisual C# 2005 Express Editionと,SQL Server 2005 Express Editionのそれぞれ日本語版を使います*1

新しくなったデータベース・コントロール

 最初に,データベース・アプリケーションの開発で大きな役割を果たす,データベース・コントロール(Windowsフォームで使うもの)がどう変わったかを見てみましょう。一番の変更点は,前版のVS 2003のデータベース関連コントロールのうち,データベースへの接続やデータ操作機能を提供する「xxxDataAdapter」「xxxConnection」「xxxCommand」のコントロール(それぞれSQL Server,Oracle,OLE DB*2,ODBC*3ごとに用意されており,xxxの部分に名称が入ります)がなくなったことです。VS 2005では,従来と同じDataSetコントロールのほかに,「DataGridView」「BindingSource」「BindingNavigator」コントロールが新しく加わります*4図1)。

図1●Visual C# 2005 Express Editionのデータベース関連のコントロール
図1●Visual C# 2005 Express Editionのデータベース関連のコントロール

 データベース・コントロールの関係や役割は,ざっと図2のようになります。ADO .NET 1.1の中核コントロール(DataAdapter,Connection,Command)が果たしてきた役割は,今後は「TableAdapter」クラスが担当するというわけです。しかし,TableAdapterクラスは,図1のツールボックスに見当たりませんね。実はTableAdapterクラスは“VS 2005が生成する”クラスなのです。詳しくは後で説明しますが,VS 2005でのデータベース・アプリケーション開発で非常に重要な働きをするクラスであることを,まず覚えておいてください。

図2●Windowsプロジェクトで利用できるデータベース・コントロールの関係。VS 2005(b)では,VS 2003(a)の三つのコントロール(DataAdapter,Connection,Command)に代わり,TableAdapterクラスを使う
図2●Windowsプロジェクトで利用できるデータベース・コントロールの関係。VS 2005(b)では,VS 2003(a)の三つのコントロール(DataAdapter,Connection,Command)に代わり,TableAdapterクラスを使う
[画像のクリックで拡大表示]

 新たに加わったBindingSourceコントロールとBindingNavigatorコントロールは,それぞれ連携しながらデータ表示/操作の管理を行います。BindingSourceコントロールは,データソースになるDataSet(メモリーに格納されたテーブルの内容や情報)を一元的に管理します。そしてBindingSourceに接続しているBindingNavigatorコントロールに,カレント・レコード(現在操作しているレコード)の移動,追加,削除の機能を提供します。一方,BindingNavigatorコントロールは,カレント・レコードを操作するためのユーザー・インタフェース部品です。「次に移動」「前に戻る」「最初/最後に移動」「新規追加」「削除」「保存」といったボタンを備えています。

 BindingSourceコントロールは,DataBindingsプロパティ経由でBindingSourceにアクセスする他のデータ・コントロール(データ入力や表示を行うコントロール)にも,カレント・レコードの情報を提供します。これは,BindingSourceに接続しているすべてのコントロールが,同じDataSet上のカレント・レコードを参照することを意味します。したがって,BindingNavigatorでレコードの位置を移動させると,それに伴ってすべてのデータ・コントロールの表示内容も同時に変わります。反対に,データ・コントロールで入力・更新されたレコードの内容も,ほかのコントロールにすぐさま反映されます。

 そのほか,BindingSourceコントロールは様々なメソッドやプロパティを備えています。これらをプログラムで直接操作すれば,BindingNavigatorを使わずに,レコード操作を行うことも可能です。

 DataGridViewコントロールは,現行のDataGridコントロールの機能拡張版です。DataGridでは,画像イメージを含むカラム(列)を表示するにはカスタマイズが必要ですが,DataGridViewでは標準機能としてカラムの画像を表示できます。また,Rowsプロパティを直接指定することで,データソースとバインドしていないデータを表示することも可能です。プログラムでプロパティを操作すれば,表示したいセル位置(Row/Col位置)をグリッドの左上に移動させるといったこともできます。また,面白い機能としては,グリッドのデータをクリップボードにコピーする機能も追加されています。図3は,グリッドに表示したデータをクリップボードにコピーし,それを取得してラベルとして表示するアプリケーションです。クリップボードにコピーするボタンのイベント・ハンドラはリスト1の通りです。クリップボードへのコピーとデータ取得が簡単に記述できることがわかると思います。

図3●グリッドに表示したデータをクリップボードにコピーし,それを取得してラベルとして表示するアプリケーション
図3●グリッドに表示したデータをクリップボードにコピーし,それを取得してラベルとして表示するアプリケーション


private void button2_Click(object sender, EventArgs e)
{
 //ヘッダー部分はコピーの対象としない
 dataGridView1.ClipboardCopyMode =
  DataGridViewClipboardCopyMode.
  EnableWithoutHeaderText;

 //グリッドで選択されているセルの数を確認
 if (dataGridView1.GetCellCount(
  DataGridViewElementStates.Selected) > 0)
 {
  try
  {
   //グリッドからデータを取得し,クリップボードへ転送
   Clipboard.SetDataObject(dataGridView1.
    GetClipboardContent().GetData(DataFormats.Text));

   //クリップボードのデータを取得し,ラベルに表示
   label1.Text = Clipboard.GetDataObject().
    GetData(DataFormats.Text).ToString();
   label1.Visible = true;
  }
  catch (System.Runtime.InteropServices.
   ExternalException)
  {
   MessageBox.Show("クリップボードへの格納に失敗");
   label1.Visible = false;
  }
 }
}
リスト1●図3のアプリケーションのbutton2のClickイベント・ハンドラ。DataGridViewは,データをクリップボードにコピーする機能を持つ