10.2.3 特殊クエリの実装方法
このObjectDataSourceオブジェクトとテーブルアダプタを組み合わせる方法の利点は、ウィザードベースで定義できないような特殊なクエリも実装できるという点である。
第7章にて解説したように、テーブルアダプタクラスはpartial定義により機能拡張できる(図10-7)。これを利用すると、パラメータ化できるような簡単なクエリはウィザードで定義し、ウィザードで定義できない一部の特殊なクエリはpartial定義により手作業で実装することができる。
|
図10-7 partial定義を利用したテーブルアダプタクラスの機能拡張 |
10.2.4 データコンポーネント機能とObjectDataSourceオブジェクトを組み合わせた実装例
上記の方法を利用して、図10-1にて示したアプリケーションを開発してみよう。
A.partialクラスを利用したデータコンポーネント機能の拡張
まず、WebサイトにAuthorsDataSet.xsdファイルを追加し、ここにウィザードベースで設定できるクエリをすべて設定しておく(図10-8)。次に、ウィザードベースで設定できないクエリを追加するために、App_Codeフォルダ下にクラスファイルを1つ追加し(図10-9)、リスト10-2のようなコード(partialクラス)を記述する。
|
図10-8 テーブルコンポーネント機能による標準的なクエリの準備 |
|
図10-9 partial定義を行うためのクラスファイルの追加 |
using System;
using System.Data;
using System.Data.SqlClient;
using System.ComponentModel;
namespace AuthorsDataSetTableAdapters
{
// partial 定義による拡張の例
public partial class authorsTableAdapter
{
[DataObjectMethod(DataObjectMethodType.Select)]
public AuthorsDataSet.authorsDataTable GetDataByTop(int n)
{
string query = string.Format("SELECT TOP {0} * FROM authors", n);
SqlDataAdapter sqlda = new SqlDataAdapter(query, this.Connection);
AuthorsDataSet.authorsDataTable table = newAuthorsDataSet.authorsDataTable();
sqlda.Fill(table);
return table;
}
[DataObjectMethod(DataObjectMethodType.Select)]
public AuthorsDataSet.authorsDataTable GetDataByState2(string state)
{
SqlDataAdapter sqlda;
if (state == "all")
{
sqlda = new SqlDataAdapter("SELECT * FROM authors",this.Connection);
}
else
{
sqlda = new SqlDataAdapter("SELECT * FROM authors WHEREstate=@state", this.Connection);
sqlda.SelectCommand.Parameters.AddWithValue("@state", state);
}
AuthorsDataSet.authorsDataTable table = newAuthorsDataSet.authorsDataTable();
sqlda.Fill(table);
return table;
}
}
}
|
Imports System.Data
Imports System.Data.SqlClient
Imports System.ComponentModel
Namespace AuthorsDataSetTableAdapters
' partial 定義による拡張の例
Partial Public Class authorsTableAdapter
<DataObjectMethod(DataObjectMethodType.Select)> _
Public Function GetDataByTop(ByVal n As Integer)AsAuthorsDataSet.authorsDataTable
Dim query As String = String.Format("SELECT TOP {0} * FROM authors", n)
Dim sqlda As SqlDataAdapter = New SqlDataAdapter(query,Me.Connection)
Dim table As AuthorsDataSet.authorsDataTable = NewAuthorsDataSet.authorsDataTable()
sqlda.Fill(table)
Return table
End Function
<DataObjectMethod(DataObjectMethodType.Select)> _
Public Function GetDataByState2(ByVal state As String) AsAuthorsDataSet.authorsDataTable
Dim sqlda As SqlDataAdapter
If state = "all" Then
sqlda = New SqlDataAdapter("SELECT * FROM authors",Me.Connection)
Else
sqlda = New SqlDataAdapter("SELECT * FROM authors WHEREstate=@state", Me.Connection)
sqlda.SelectCommand.Parameters.AddWithValue("@state", state)
End If
Dim table As AuthorsDataSet.authorsDataTable = NewAuthorsDataSet.authorsDataTable()
sqlda.Fill(table)
Return table
End Function
End Class
End Namespace
|
|
リスト10-2 partial定義によるテーブルアダプタクラスの拡張 |
以上の準備が終わったら、引き続きWebフォームを作成していく。まず、図10-1の左側の画面から実装方法を示す。
B.上限件数を指定した検索の作成方法
この場合は、図10-10のような画面を作成し、図10-11のようにObjectDataSourceオブジェクトをテーブルアダプタクラスに接続すればよい。なお、テーブルアダプタクラスに引き渡すメソッド引数は、他のWebコントロールなどから直接入手することができる。
|
図10-10 上限件数を指定した検索の作成方法 |
|
図10-11 ObjectDataSourceオブジェクトとテーブルアダプタの連結 |
C.検索条件が動的に切り替わるようなフィルタリングアプリケーション
図10-1の右側の画面の場合には、図10-12のような画面を作成し、ObjectDataSourceオブジェクトを介してpartialクラス上のメソッドに連結すればよい。
|
図10-12 動的にクエリが変化するアプリケーションの実装例 |
このように、ObjectDataSourceオブジェクトとデータコンポーネント機能(テーブルアダプタ)を組み合わせると、ウィザードベースでの開発による生産性の高さを得ながら、同時にpartialクラスによる柔軟性の高さを得ることができる。実際の業務アプリケーション開発では、このような開発生産性の高さと柔軟性の高さを併せ持った設計・実装方式を編み出して利用することが大切である。
Insider.NET 記事ランキング
本日
月間