テーブルアダプタには、それとペアになっているデータテーブル(本稿ではMyTableデータテーブル)と、その基になったデータベースのテーブル(本稿ではMyDBデータベースのMyTableテーブル)にかかわるクエリを自由に追加することができます*2。
*2 実際にはそのデータテーブルやテーブルに無関係のクエリを追加することもできます。
■条件検索を行うクエリの追加
ここでは次のようなメソッドとなるクエリを追加してみます。
Function FillByAddress(ByVal dataTable As MyDBDataSet.MyTableDataTable, ByVal address As String) As Integer
このメソッドは、第2パラメータで指定した文字列と一致するaddress列の項目を持つレコードを検索し、その結果を第1パラメータで指定したデータテーブルに格納します。
まずデータセット・デザイナでテーブルアダプタを選択し、右クリックして[クエリの追加]を実行します。
これにより「TableAdapterクエリの構成ウィザード」が開始します。
最初の画面では、クエリ内でSQL文を発行するか、ストアド・プロシージャを呼び出すかを選択します。今回は「SQLステートメントを使用する」を選択します。
次に「使用するSQLクエリの種類」を選択します。
図9にあるように、クエリで実行できるSQL文は、あらかじめ5つのパターンに絞られています。ここでは「複数行を返すSELECT」を選択します。
続く画面では、クエリで使用するSELECT文を記述します。
テーブルからすべてのレコードを取得するSELECT文があらかじめ記述されています。このまま先に進めると、すでにあるFill,GetData()クエリとまったく同一内容のクエリが出来上がります。もちろんそれでは意味がないので、ここでWHERE句を追加して、次のようなSELECT文を記述します。「@address」の部分は外部から値を指定する「名前付きパラメータ」です。
SELECT id, name, address, birthday
FROM MyTable WHERE address = @address
直接SELECT文を書き換えてもよいのですが、クエリ・ビルダを使えば、より確実にSELECT文を作成することができます。
クエリ・ビルダでは、addressの行の「フィルタ」部分に「= @address」と追加すれば、WHERE句が自動的に追加されます。
次の図12はクエリ・ビルダによりWHERE句を追加した後の画面です。
次の画面に進むと、テーブルアダプタに追加するメソッドを選択し、メソッドの名前を決めることができます。この画面を見ると、Fill,GetData()クエリが、なぜ2つのメソッド名をセットにしたものだったのかが分かりますね。
メソッド名の指定部分では、「Fill」と「GetData」の後にあらかじめ「By」が付けられていて、何によってSELECTを行ったのかを書き足せばいいようになっています。address列で絞り込んだので、メソッド名は素直に「FillByAddress」と「GetDataByAddress」にしておきます。後者のメソッドは不要ですが、取りあえず作成してみます。
次の画面に進めばクエリの追加は完了です。
クエリ追加後のデータセット・デザイナの画面は次のようになります。
ではここでもデータのプレビューを行って、クエリが正しく動作するか確認してみましょう。
■追加したクエリのプレビュー
今度は実行するSELECT文が名前付きパラメータを含んでいますので、[プレビュー]ボタンをクリックする前に、パラメータの値として適当な文字列を入力する必要があります。
パラメータに「オーストリア」を指定した場合のクエリの実行結果は次のようになります。
そして、いま作成したクエリをコードにより実行するときには次のようになります。
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
業務アプリケーションの参照系の処理では、たいてい最初にデータの検索(絞り込み)を行いますが、その検索処理に合わせてこのようなクエリをテーブルアダプタに追加していきます。
なお、自動生成されるFill,GetData()クエリはすべてのレコードを取得するためのものでしたが、データセットにあらかじめレコードを蓄えてから業務を行うモデルでは、レコード件数が多い場合にそのようなクエリを実行してしまうとメモリが大量に消費されてしまうので注意が必要です。
Copyright© Digital Advantage Corp. All Rights Reserved.