第3回 テーブルアダプタの基礎連載:Visual Studio 2005によるWindowsデータベース・プログラミング(1/3 ページ)

SQL文を記述するだけでDBのアクセス処理をすっきりと実装できる新機能「テーブルアダプタ」。VB 2005で使ってみよう。

» 2007年03月23日 00時00分 公開
[遠藤孝信デジタルアドバンテージ]
連載:Visual Studio 2005によるWindowsデータベース・プログラミング
業務アプリInsider/Insider.NET

powered by Insider.NET

「連載:Visual Studio 2005によるWindowsデータベース・プログラミング」のインデックス

連載目次

 前回では、データベースから取得したレコードの入れ物となるデータセット(およびデータテーブル)について解説しました。今回はデータベースとデータセットの橋渡し役となるテーブルアダプタ(TableAdapter)について解説します。

 このテーブルアダプタは.NET Framework 1.xのころにはなかったVisual Studio 2005の新しい機能で、アプリケーションのデータベース・アクセスにかかわる処理をすっきりとまとめることができます。

テーブルアダプタとは?

 テーブルアダプタは、データベースのテーブルからレコードを取得し、取得したレコードをデータセット内のデータテーブルに格納する機能を持ったコンポーネントです。

 実際には次の図のように、テーブルアダプタがデータベースに対してSELECT文を発行し、その結果(通常は複数のレコード)をデータテーブルに挿入します。前回でも述べたように、典型的な.NETのWindowsデータベース・アプリケーションでは、最初に一度だけこのようなデータベース処理を行い、それ以降はデータベースとは切り離された状態で(データテーブル内のデータに対して)業務処理を行います。

図1 データテーブルとデータベースの橋渡し役となるテーブルアダプタ

 テーブルアダプタはまた、ユーザーの操作により追加/編集/削除されたデータテーブルの内容をデータベースのテーブルに反映するために、INSERT/UPDATE/DELETE文なども発行します。またさらに、例えばレコードの件数を知りたい場合には、テーブルアダプタにそのようなSELECT文を発行する機能を独自に追加して、それを呼び出すことができます。

 このようにWindowsデータベース・アプリケーションでは、データベースに関する処理をすべてテーブルアダプタの機能として実装し、それをビジネス・ロジックから呼び出すというのが基本的なパターンです。

 ではさっそく、Visual Basic 2005 Express Editionを使用しながらテーブルアダプタについて見ていきましょう。

データセット・デザイナ上のテーブルアダプタ

 前回では、データセットをプロジェクトに追加し、データセット・デザイナにデータベース・エクスプローラからテーブルをドラッグ&ドロップしてデータテーブルを作成しましたが、実はこの時点で自動的にテーブルアダプタも作成されていました。

 データセット・デザイナでは、データテーブル「MyTable」の下にくっついている「MyTableTableAdapter」部分がテーブルアダプタを表しています。

図2 データセット・デザイナで表示したデータテーブルとテーブルアダプタ
データベース・エクスプローラからテーブルをドラッグ&ドロップしてデータテーブルを作成した場合には自動的にテーブルアダプタが作成される。
  (1)データテーブル。
  (2)テーブルアダプタ。

 MyTableTableAdapterには、「Fill,GetData()」という「クエリ」があらかじめ自動生成されています。テーブルアダプタのクエリは、テーブルアダプタに実装されている呼び出し可能な機能の単位です。

 Fill,GetData()クエリは、データベースからレコードを取得する処理を行うためのものです。このクエリで使用されるSELECT文を確認するには、クエリの部分を選択してそのプロパティを表示し、CommandTextプロパティの部分を見ます。マウス・カーソルをクエリ部分にかざしてもツールチップにより確認できます。

図3 Fill,GetData()クエリで実行されるSELECT文
Fill,GetData()クエリにはSELECT文が含まれている。
  (1)SELECT文はクエリのCommandTextプロパティにより確認できる。
  (2)クエリ部分に表示されるツールチップにもSELECT文の内容が表示される。

■クエリを実行してデータをプレビュー

 Fill,GetData()クエリを呼び出すとこのSELECT文が実行されるわけですが、それによりどのような結果が得られるかは、クエリ部分を右クリックし、メニューから[データのプレビュー]を実行することにより事前に確認できます。

 [データのプレビュー]を実行すると、次のようなダイアログが表示され、[プレビュー]ボタンをクリックすることにより、Fill,GetData()クエリの実行結果が表示されます(ここで表示される実行結果のレコードは第1回で入力しておいたレコードです)。

図4 Fill,GetData()クエリのプレビュー
クエリにより取得されるレコードを事前に確認することができる。
  (1)[プレビュー]ボタンをクリックすると実際にSELECT文が発行される。
  (2)Fill,GetData()クエリの実行結果。

 実際には、この実行結果がデータテーブル「MyTable」に格納されることになります。

データテーブルの実体

 テーブルアダプタの実体は、自動生成されたクラスです。そのクラス名はテーブルアダプタの名前と同じになります。このクラスは、前回で見たデータセットのクラスと同じ、データセットのコードビハインド・ファイル(<データセット名>.Designer.vb)に記述されます。

 また、Fill,GetData()クエリというのは、自動生成されたクラスで定義されているFillメソッドとGetDataメソッドを1つのクエリとしてまとめて表したものです。そのソース・コードでメソッドの定義を見れば分かりますが、これら2つのメソッドはPublicなメソッドであり、次のようなパラメータや戻り値を持ちます。

  • Function Fill(ByVal dataTable As MyDBDataSet.MyTableDataTable) As Integer
  • Function GetData() As MyDBDataSet.MyTableDataTable

 すでに述べたように、これらのメソッドはどちらも、そのメソッド内でSELECT文を発行してレコードを取得し、それをデータテーブルに詰めて返すものですが、この2つはその返し方が異なります。

 まずFillメソッドは、パラメータとしてデータテーブルのオブジェクトを受け取り*1、そのデータテーブルに対して、取得した結果を格納します。戻り値は取得したレコード件数となります。一方、GetDataメソッドはメソッド内部でデータテーブルのオブジェクトを作成し、そこにSELECT文の結果を格納して、そのオブジェクトを返します。

*1 パラメータの型が「MyDBDataSet.MyTableDataTable」となっているのは、MyTableDataTableクラスが、データセットの実体であるMyDBDataSetクラスの入れ子クラスだからです。


 実際に使用するかどうかにかかわらず、通常、テーブルアダプタには、この2つの形式のメソッドがセットで作成されます。データセット・デザイナは、これらの2つのメソッドを「Fill,GetData()」のようにセットにして表示するようです。

■コードによるクエリの実行

 ではここで実際に、コードからテーブルアダプタのメソッドを呼び出してみましょう。前回の最後にデータセットを使った実験を行いましたが、それとほぼ似た手順です。

 まず図3の状態で一度プロジェクトをビルドします。これで、ツールボックスには[MyDBDataSet]と[MyTableTableAdapter]という2つのコンポーネントが登録されているはずです。これらをフォームにドラッグ&ドロップします。そしてそれぞれの(Name)プロパティを「daAddress」と「taAddress」に変更しておきます。これはデータセットとテーブルアダプタのインスタンス名となります。さらにフォーム上にはDataGridViewコントロールを配置します。

図5 クエリの呼び出しを行うためのフォームのデザイン
ツールボックスからフォーム上に、[MyDBDataSet]コンポーネント、[MyTableTableAdapter]コンポーネント、DataGridViewコントロールを配置する。
  (1)データセットである[MyDBDataSet]。(Name)プロパティを「daAddress」に変更。
  (2)データテーブルである[MyTableTableAdapter]。(Name)プロパティを「taAddress」に変更。
  (3)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

フォームのLoadイベント・ハンドラに追加するコード
Fillメソッドによりデータテーブルにレコードを格納し、データテーブルとDataGridViewコントロールを連結する。

 プログラムを実行して次の画面のようにデータベースのレコードが表示されれば実験は成功です。

図6 プログラムの実行画面
データベースから取得されたレコードが表示されている。

 続いては、テーブルアダプタに独自にクエリを追加してみます。

       1|2|3 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。