本コーナーは、.NET関連の新刊書籍から主要なチャプターをそのまま転載し、その内容を紹介するものです。
今回は日経BPソフトプレス/マイクロソフトプレスより2006年5月22日発行の書籍『Microsoft Visual Studio 2005によるWebアプリケーション構築技法―ASP.NET 2.0上での参照系・更新系アプリケーションの設計』より、同社の許可を得てその内容を転載しています。
本書は、Webアプリ構築の実践的テクニックを網羅し、.NET開発者から高い評価を得ている書籍『.NETエンタープライズWebアプリケーション 開発技術大全』シリーズの著者であるマイクロソフトのコンサルタント赤間氏による新刊書籍です。
本書では、新しくなったVisual Studio 2005およびSQL Server 2005をベースに、ASP.NET 2.0の基本的な動作や開発方法(第1部)、参照系業務アプリ構築に必要なデータバインド手法(第2部)、更新系業務アプリ構築のための基本的なトランザクション制御方法(第3部)といった中小規模Webアプリの構築技法を一冊にまとめています。
前回の「7.6 データコンポーネント機能によるデータアクセスコンポーネントの開発」からの転載に続き、本稿では「第10章 3階層型自動データバインド」を転載しています。ここではVisual Studio 2005のウィザードによる2階層型のデータバインドでは対応しきれないデータベース・アクセスについて解説されています。
具体的には、テーブルアダプタにアクセスする「ビジネス・オブジェクト」を追加し、それをフォームのデータソースとして利用することにより、より柔軟なデータアクセスが可能になります。本稿の最後では、この手法を用いた大量データのページング制御についても紹介されています。
なお、書籍の詳細については書籍情報のページをご覧ください。 |
ご注意:本記事は、書籍の内容を改訂することなく、そのまま転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。 |
|
前章で解説した2階層型自動データバインドは極めて便利な機能である。しかし、ウィザードベースでSQL文を定義しなければならない関係上、バックエンドのデータベースサーバーに対して柔軟なSQL文発行を行うことができない。本章では、特殊なSQL文によるデータ取得を可能とするようなデータバインド手法を学習する。
10.1 2階層型自動データバインドの限界
業務アプリケーションの大半は、前章で解説した2階層型自動データバインド(SqlDataSourceオブジェクトを利用したデータバインド)のみで開発を進めることができるだろう。しかし実際の業務アプリケーション開発では、以下のような特殊なクエリが混ざっていることが多い(図10-1)。
- パラメータ化できない可変値を持つクエリ
- 例:SELECT TOP @top * FROM authors
- TOP句はパラメータ化できないため、このクエリはSqlDataSourceオブジェクト上に定義できない。
- 条件に応じて動的に変化するWHERE句を持つクエリ
- 指定された検索条件を基に、動的にWHERE句を組み立てるような業務
|
図10-1 2階層型自動データバインド方式では開発できない業務アプリケーションの例 |
実際の業務アプリケーションでは、往々にしてこのような「ウィザードベースでは開発できない」処理が少ないながらも混ざっている。しかし、このような処理があるからといって、ウィザードベースでの開発を全面的に諦めてしまうと、開発生産性を高めることができない。
10.2 ObjectDataSourceを用いたデータバインド
この問題は、データコンポーネント機能(.xsdファイル)とObjectDataSourceオブジェクトとを組み合わせることにより解決できる。しかし、これを一気に解説することは困難であるため、順を追って解説する。
- ObjectDataSourceオブジェクトを利用したデータバインド
- ObjectDataSourceオブジェクトからのテーブルアダプタの呼び出し
- 特殊クエリの実装方法
- データコンポーネント機能とObjectDataSourceオブジェクトを組み合わせた実装例
10.2.1 ObjectDataSourceオブジェクトを利用したデータバインド
前章では、GridViewコントロールなどに対してデータを供給するオブジェクトとして、SqlDataSourceオブジェクトを利用した。しかし、ここで解説するObjectDataSourceオブジェクトを利用すると、型付きデータセット(または型付きデータテーブル)を返すようなクラスを、データソースとして利用できるようになる。
ObjectDataSourceオブジェクトを利用する方法を図10-2に示す。あらかじめ、データ入出力を行うデータアクセスクラスまたはビジネスロジッククラスをC#またはVBのコードとして用意しておき(リスト10-1)、これをObjectDataSourceオブジェクトから呼び出すように設定する。このようにすると、自前で作成したクラスを利用して、自由にSQL文を発行することができるようになる※1。
※1 データの入手方法はデータベースからだけとは限らない。例えば、XML Webサービスから入手したデータを返すようなクラスを作成し、これをObjectDataSourceコントロールにより連結しても構わない。 |
|
図10-2 ObjectDataSourceオブジェクトの利用 |
public class DataAccessComponent {
public DataAccessComponent() {}
[DataObjectMethod(DataObjectMethodType.Select)]
public AuthorsDataSet.authorsDataTable GetData() {
AuthorsDataSet ads = new AuthorsDataSet();
authorsTableAdapter ta = new authorsTableAdapter();
ta.Fill(ads.authors);
return ads.authors; // データベースから取得したデータを型付きデータテーブルとして返す
}
}
|
Public Class DataAccessComponent
<DataObjectMethod(DataObjectMethodType.Select)> _
Public Function GetData() As AuthorsDataSet.authorsDataTable
Dim ads As New AuthorsDataSet()
Dim ta As New authorsTableAdapter()
ta.Fill(ads.authors)
Return ads.authors ' データベースから取得したデータを型付きデータテーブルとして返す
End Function
End Class
|
|
リスト10-1 Hello World ASP.NETアプリケーション |
10.2.2 ObjectDataSource オブジェクトからのテーブルアダプタの呼び出し
さて、ObjectDataSourceオブジェクトに接続するクラスは、以下のような条件を満たしている必要がある。
- デフォルトコンストラクタを持つ。
- 型付きデータセットまたは型付きデータテーブルを返すメソッドを持つ。
- (可能であれば)DataObjectMethod属性により、各メソッドの種類が示されている※2。
※2 このメソッド属性が付与されていると、ObjectDataSource構成ウィザードに当該メソッドを認識させることができる。 |
実は、第7章で学習したデータコンポーネント機能(.xsdファイル)によって生成されるテーブルアダプタクラスは、これらの条件を全て満たしている。よって、ObjectDataSourceオブジェクトの背後にこのテーブルアダプタクラスを連結して利用することができる(図10-3)。
|
図10-3 テーブルアダプタクラスとObjectDataSourceオブジェクトの連結 |
例えば図10-4に示すアプリケーションは、以下のようにしても実装できる。
- 当該Webサイトに.xsdファイルを追加し、州の一覧を取り出すクエリと、データを取り出すクエリを定義する(図10-5)。
- 画面上にObjectDataSourceオブジェクトとWebコントロールを貼り付ける。
- ObjectDataSourceオブジェクトのデータソース構成ウィザードを開き、作成したテーブルアダプタ上のメソッドを紐付ける(図10-6)。
|
図10-4 データをフィルタリングする機能を持つデータバインドアプリケーション |
|
図10-5 ObjectDataSourceオブジェクトを用いた3階層自動データバインドを利用する際の設計 |
|
図10-6 ObjectDataSourceオブジェクトのデータソースの構成 |
このようにすれば、第2部「9.3.4 フィルタリング」にて解説したアプリケーションを、3階層型自動データバインドにより開発することができる。
Insider.NET 記事ランキング
本日
月間