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

» 2007年03月23日 00時00分 公開
[遠藤孝信デジタルアドバンテージ]

テーブルアダプタへのクエリ追加

 テーブルアダプタには、それとペアになっているデータテーブル(本稿ではMyTableデータテーブル)と、その基になったデータベースのテーブル(本稿ではMyDBデータベースのMyTableテーブル)にかかわるクエリを自由に追加することができます*2

*2 実際にはそのデータテーブルやテーブルに無関係のクエリを追加することもできます。


■条件検索を行うクエリの追加

 ここでは次のようなメソッドとなるクエリを追加してみます。

Function FillByAddress(ByVal dataTable As MyDBDataSet.MyTableDataTable, ByVal address As String) As Integer

 このメソッドは、第2パラメータで指定した文字列と一致するaddress列の項目を持つレコードを検索し、その結果を第1パラメータで指定したデータテーブルに格納します。

 まずデータセット・デザイナでテーブルアダプタを選択し、右クリックして[クエリの追加]を実行します。

図7 [クエリの追加]の実行
テーブルアダプタの部分を右クリックして[クエリの追加]を実行する。

 これにより「TableAdapterクエリの構成ウィザード」が開始します。

図8 TableAdapterクエリの構成ウィザード(1/6)
クエリ内にSELECT文に含めるか、ストアド・プロシージャを呼び出すかを選択する。今回では「SQLステートメントを使用する」を選択する。

 最初の画面では、クエリ内でSQL文を発行するか、ストアド・プロシージャを呼び出すかを選択します。今回は「SQLステートメントを使用する」を選択します。

 次に「使用するSQLクエリの種類」を選択します。

図9 TableAdapterクエリの構成ウィザード(2/6)
クエリで実行できるSQL文は、あらかじめ5つのパターンに絞られている。今回は「複数行を返すSELECT」を選択する。

 図9にあるように、クエリで実行できるSQL文は、あらかじめ5つのパターンに絞られています。ここでは「複数行を返すSELECT」を選択します。

 続く画面では、クエリで使用するSELECT文を記述します。

図10 TableAdapterクエリの構成ウィザード(3/6)
クエリで使用するSELECT文を記述する。直接編集することもできるが、クエリ・ビルダを使うとGUIによりSQL文を作成できる。
  (1)クエリ・ビルダの起動。

 テーブルからすべてのレコードを取得するSELECT文があらかじめ記述されています。このまま先に進めると、すでにあるFill,GetData()クエリとまったく同一内容のクエリが出来上がります。もちろんそれでは意味がないので、ここでWHERE句を追加して、次のようなSELECT文を記述します。「@address」の部分は外部から値を指定する「名前付きパラメータ」です。

SELECT id, name, address, birthday
    FROM MyTable WHERE address = @address

 直接SELECT文を書き換えてもよいのですが、クエリ・ビルダを使えば、より確実にSELECT文を作成することができます。

図11 クエリ・ビルダ
クエリ・ビルダではSQLの構文にあまり詳しくなくてもSQL文を記述できる。ここではaddress列によりレコードを絞り込むので、(1)の欄に「= @address」を記述する。

 クエリ・ビルダでは、addressの行の「フィルタ」部分に「= @address」と追加すれば、WHERE句が自動的に追加されます。

 次の図12はクエリ・ビルダによりWHERE句を追加した後の画面です。

図12 TableAdapterクエリの構成ウィザード(4/6)
クエリ・ビルダで作成したSELECT文が反映されている。

 次の画面に進むと、テーブルアダプタに追加するメソッドを選択し、メソッドの名前を決めることができます。この画面を見ると、Fill,GetData()クエリが、なぜ2つのメソッド名をセットにしたものだったのかが分かりますね。

図13 TableAdapterクエリの構成ウィザード(5/6)
追加するメソッドとメソッド名を指定する。ウィザードでは1つのSELECT文について2つの形式のメソッドを生成できる。ここではメソッド名を「FillByAddress」と「GetDataByAddress」にする。

 メソッド名の指定部分では、「Fill」と「GetData」の後にあらかじめ「By」が付けられていて、何によってSELECTを行ったのかを書き足せばいいようになっています。address列で絞り込んだので、メソッド名は素直に「FillByAddress」と「GetDataByAddress」にしておきます。後者のメソッドは不要ですが、取りあえず作成してみます。

 次の画面に進めばクエリの追加は完了です。

図14 TableAdapterクエリの構成ウィザード(6/6)
ウィザードの最終画面。ここではFillメソッド(=FillByAddressのこと)とGetメソッド(=GetDataByAddressメソッドのこと)が作成されたのを確認できる。

 クエリ追加後のデータセット・デザイナの画面は次のようになります。

図15 追加されたFillByAddress,GetDataByAddress(@address)クエリ

 ではここでもデータのプレビューを行って、クエリが正しく動作するか確認してみましょう。

■追加したクエリのプレビュー

 今度は実行するSELECT文が名前付きパラメータを含んでいますので、[プレビュー]ボタンをクリックする前に、パラメータの値として適当な文字列を入力する必要があります。

図16 FillByAddress,GetDataByAddress(@address)クエリのプレビュー
名前付きパラメータ「address」の値を指定して[プレビュー]ボタンをクリックする。
  (1)今回は検索条件として、ここに「オーストリア」を入力する。

 パラメータに「オーストリア」を指定した場合のクエリの実行結果は次のようになります。

図17 プレビューを実行した画面
address列の値が「オーストリア」のレコードのみが結果として表示されている。

 そして、いま作成したクエリをコードにより実行するときには次のようになります。

Public Class Form1
  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    ' テーブルアダプタのFillByAddressメソッド呼び出し
    Me.taAddress.FillByAddress(Me.dsAddress.MyTable, "オーストリア")
    DataGridView1.DataSource = Me.dsAddress.MyTable

    ' グリッドとデータテーブルをデータ連結
    DataGridView1.DataSource = Me.dsAddress.MyTable

  End Sub
End Class

コードによるFillByAddressメソッドの呼び出し
FillByAddressメソッドは、第2パラメータで指定した文字列と一致するaddress列の項目を持つレコードを検索し、その結果を第1パラメータで指定したデータテーブルに格納する。

 業務アプリケーションの参照系の処理では、たいてい最初にデータの検索(絞り込み)を行いますが、その検索処理に合わせてこのようなクエリをテーブルアダプタに追加していきます。

 なお、自動生成されるFill,GetData()クエリはすべてのレコードを取得するためのものでしたが、データセットにあらかじめレコードを蓄えてから業務を行うモデルでは、レコード件数が多い場合にそのようなクエリを実行してしまうとメモリが大量に消費されてしまうので注意が必要です。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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