SQL文を記述するだけでDBのアクセス処理をすっきりと実装できる新機能「テーブルアダプタ」。VB 2005で使ってみよう。
powered by Insider.NET
前回では、データベースから取得したレコードの入れ物となるデータセット(およびデータテーブル)について解説しました。今回はデータベースとデータセットの橋渡し役となるテーブルアダプタ(TableAdapter)について解説します。
このテーブルアダプタは.NET Framework 1.xのころにはなかったVisual Studio 2005の新しい機能で、アプリケーションのデータベース・アクセスにかかわる処理をすっきりとまとめることができます。
テーブルアダプタは、データベースのテーブルからレコードを取得し、取得したレコードをデータセット内のデータテーブルに格納する機能を持ったコンポーネントです。
実際には次の図のように、テーブルアダプタがデータベースに対してSELECT文を発行し、その結果(通常は複数のレコード)をデータテーブルに挿入します。前回でも述べたように、典型的な.NETのWindowsデータベース・アプリケーションでは、最初に一度だけこのようなデータベース処理を行い、それ以降はデータベースとは切り離された状態で(データテーブル内のデータに対して)業務処理を行います。
テーブルアダプタはまた、ユーザーの操作により追加/編集/削除されたデータテーブルの内容をデータベースのテーブルに反映するために、INSERT/UPDATE/DELETE文なども発行します。またさらに、例えばレコードの件数を知りたい場合には、テーブルアダプタにそのようなSELECT文を発行する機能を独自に追加して、それを呼び出すことができます。
このようにWindowsデータベース・アプリケーションでは、データベースに関する処理をすべてテーブルアダプタの機能として実装し、それをビジネス・ロジックから呼び出すというのが基本的なパターンです。
ではさっそく、Visual Basic 2005 Express Editionを使用しながらテーブルアダプタについて見ていきましょう。
前回では、データセットをプロジェクトに追加し、データセット・デザイナにデータベース・エクスプローラからテーブルをドラッグ&ドロップしてデータテーブルを作成しましたが、実はこの時点で自動的にテーブルアダプタも作成されていました。
データセット・デザイナでは、データテーブル「MyTable」の下にくっついている「MyTableTableAdapter」部分がテーブルアダプタを表しています。
MyTableTableAdapterには、「Fill,GetData()」という「クエリ」があらかじめ自動生成されています。テーブルアダプタのクエリは、テーブルアダプタに実装されている呼び出し可能な機能の単位です。
Fill,GetData()クエリは、データベースからレコードを取得する処理を行うためのものです。このクエリで使用されるSELECT文を確認するには、クエリの部分を選択してそのプロパティを表示し、CommandTextプロパティの部分を見ます。マウス・カーソルをクエリ部分にかざしてもツールチップにより確認できます。
■クエリを実行してデータをプレビュー
Fill,GetData()クエリを呼び出すとこのSELECT文が実行されるわけですが、それによりどのような結果が得られるかは、クエリ部分を右クリックし、メニューから[データのプレビュー]を実行することにより事前に確認できます。
[データのプレビュー]を実行すると、次のようなダイアログが表示され、[プレビュー]ボタンをクリックすることにより、Fill,GetData()クエリの実行結果が表示されます(ここで表示される実行結果のレコードは第1回で入力しておいたレコードです)。
実際には、この実行結果がデータテーブル「MyTable」に格納されることになります。
テーブルアダプタの実体は、自動生成されたクラスです。そのクラス名はテーブルアダプタの名前と同じになります。このクラスは、前回で見たデータセットのクラスと同じ、データセットのコードビハインド・ファイル(<データセット名>.Designer.vb)に記述されます。
また、Fill,GetData()クエリというのは、自動生成されたクラスで定義されているFillメソッドとGetDataメソッドを1つのクエリとしてまとめて表したものです。そのソース・コードでメソッドの定義を見れば分かりますが、これら2つのメソッドはPublicなメソッドであり、次のようなパラメータや戻り値を持ちます。
すでに述べたように、これらのメソッドはどちらも、そのメソッド内でSELECT文を発行してレコードを取得し、それをデータテーブルに詰めて返すものですが、この2つはその返し方が異なります。
まずFillメソッドは、パラメータとしてデータテーブルのオブジェクトを受け取り*1、そのデータテーブルに対して、取得した結果を格納します。戻り値は取得したレコード件数となります。一方、GetDataメソッドはメソッド内部でデータテーブルのオブジェクトを作成し、そこにSELECT文の結果を格納して、そのオブジェクトを返します。
*1 パラメータの型が「MyDBDataSet.MyTableDataTable」となっているのは、MyTableDataTableクラスが、データセットの実体であるMyDBDataSetクラスの入れ子クラスだからです。
実際に使用するかどうかにかかわらず、通常、テーブルアダプタには、この2つの形式のメソッドがセットで作成されます。データセット・デザイナは、これらの2つのメソッドを「Fill,GetData()」のようにセットにして表示するようです。
■コードによるクエリの実行
ではここで実際に、コードからテーブルアダプタのメソッドを呼び出してみましょう。前回の最後にデータセットを使った実験を行いましたが、それとほぼ似た手順です。
まず図3の状態で一度プロジェクトをビルドします。これで、ツールボックスには[MyDBDataSet]と[MyTableTableAdapter]という2つのコンポーネントが登録されているはずです。これらをフォームにドラッグ&ドロップします。そしてそれぞれの(Name)プロパティを「daAddress」と「taAddress」に変更しておきます。これはデータセットとテーブルアダプタのインスタンス名となります。さらにフォーム上にはDataGridViewコントロールを配置します。
そしてフォームをダブルクリックし、以下のようなコードを入力します。ここではFillメソッドの方を使用しています。
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' テーブルアダプタのFillメソッド呼び出し
Me.taAddress.Fill(Me.dsAddress.MyTable)
' グリッドとデータテーブルをデータ連結
DataGridView1.DataSource = Me.dsAddress.MyTable
End Sub
End Class
プログラムを実行して次の画面のようにデータベースのレコードが表示されれば実験は成功です。
続いては、テーブルアダプタに独自にクエリを追加してみます。
Copyright© Digital Advantage Corp. All Rights Reserved.