.NET TIPS

[ASP.NET]データアクセス・コンポーネントを拡張するには?[2.0、3.0、3.5、C#、VB]

山田 祥寛
2009/05/07

 「TIPS:[ASP.NET]GridViewコントロールにオブジェクトをバインドするには?」(以下、前回のTIPS)では、ObjectDataSourceコントロールを使ってデータアクセス・コンポーネントをGridViewコントロールにバインドする方法について解説した。もっとも、そこで紹介したサンプルでは、あえてデータアクセス・コンポーネントを利用する意味は見えにくかったかもしれない。ウィザード・ベースで生成できるレベルのコマンドであれば、SqlDataSourceコントロールでも同等のことが実現できるからだ。

 しかし、データアクセス・コンポーネントを利用する意味は、ここからだ。本稿では、データアクセス・コンポーネントを拡張して、独自の機能を追加する方法を紹介する。データアクセス・コンポーネントに独自のメソッドを追加することで、ウィザードだけでは賄えない複雑な要件も実現できるようになる。

 例えば、ここでは「TIPS:[ASP.NET]GridViewコントロールにストアドプロシージャの結果を反映させるには?」で紹介したサンプルStored.aspxを、データアクセス・コンポーネントを使って書き換えてみよう。以下では、すでに作成済みのサンプルからの差分の手順のみを解説する。

選択された価格帯の書籍だけを一覧表示する(本稿で作成するサンプルの実行結果)

1. 拡張のためのコードを記述する

 ウィザードで自動生成したデータアクセス・コンポーネント(厳密にはテーブル・アダプタ)を拡張するには、部分クラス(Partialクラス)を使用する。部分クラスを利用することで、データアクセス・コンポーネントにより自動生成されるクラス定義のファイルとは完全に切り離して、別のファイルにそのクラスを拡張するコードを記述できる。部分クラスであることを宣言するには、クラス定義の先頭に「partial」(Visual Basicでは「Partial」)を付与する。

 それではさっそく、具体的なコードを見てみよう。ここでは、引数として価格(変数price)を受け取り、変数priceが0以下である場合にはすべてのレコードを、0より大きい場合には「price - 1000以上、price未満」のレコードのみを、それぞれbookテーブルから取り出すGetInfosByPriceメソッドを定義している。

using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;

// 部分クラスbookTableAdapterを定義(1)
namespace BookTableAdapters {
  public partial class bookTableAdapter {

    // SELECTメソッド(取得用のメソッド)であることを宣言(2)
    [DataObjectMethod(DataObjectMethodType.Select, false)]
    public Book.bookDataTable GetInfosByPrice(int price) {

      // SqlCommandオブジェクトを生成
      SqlCommand comm = this.Connection.CreateCommand();

      if (price > 0) {
        // 引数priceが0より大きい場合、
        // 指定価格帯の書籍情報だけを取得
        comm.CommandText =
          "SELECT * FROM book " +
            "WHERE price >= @price - 1000 AND price < @price";
        comm.Parameters.AddWithValue("@price", price);
      } else {
        // 引数priceが0以下である場合、すべての書籍情報を取得
        comm.CommandText =
          "SELECT * FROM book ORDER BY price DESC";
      }

      // 型付きデータセットを生成
      Book ds = new Book();

      // 型付きデータテーブル(bookDataTable)に結果を流し込み(3)
      this.Adapter.SelectCommand = comm;
      this.Adapter.Fill(ds.book);
      return ds.book;
    }
  }
}
Imports System.ComponentModel
Imports System.Data
Imports System.Data.SqlClient
Imports Microsoft.VisualBasic

' 部分クラスBookTableAdapters.bookTableAdapterを定義(1)
Namespace BookTableAdapters
  Partial Public Class bookTableAdapter

    ' SELECTメソッド(取得用のメソッド)であることを宣言(2)
    <DataObjectMethod(DataObjectMethodType.Select, False)> _
    Public Function GetInfosByPrice(ByVal price As Integer) As Book.bookDataTable

      ' SqlCommandオブジェクトを生成
      Dim comm As SqlCommand = Me.Connection.CreateCommand()

      If price > 0 Then
        ' 引数priceが0より大きい場合、
        ' 指定価格帯の書籍情報だけを取得
        comm.CommandText = _
          "SELECT * FROM book " & _
            "WHERE price >= @price - 1000 AND price < @price"
          comm.Parameters.AddWithValue("@price", price)
      Else
        ' 引数priceが0以下である場合、すべての書籍情報を取得
        comm.CommandText = _
          "SELECT * FROM book ORDER BY price DESC"
      End If

      ' 型付きデータセットを生成
      Dim ds As New Book

      ' 型付きデータテーブル(bookDataTable)に結果を流し込み(3)
      Me.Adapter.SelectCommand = comm
      Me.Adapter.Fill(ds.book)
      Return ds.book
    End Function
  End Class
End Namespace
テーブル・アダプタを拡張するための部分クラス(上がbookTableAdapter.cs、下がbookTableAdapter.vb)

 全体的なコードの流れはリスト内のコメントを参照いただくとして、ここではポイントとなる部分に注目してみよう。

(1)自動生成されたクラスの名前

 前回のTIPSで述べたように、自動生成されたテーブル・アダプタは「<.xsdファイル名>TableAdapters」名前空間に属し、クラス名は「<テーブル名>TableAdapter」である。

 部分クラスを定義するには、(当然)片割れとなるクラスと同じ名前空間に属しており、同じクラス名である必要があるので、ここではBookTableAdapters名前空間のbookTableAdapterクラスを定義する。

(2)メソッドの種類を宣言するDataObjectMethod属性

 DataObjectMethod属性(System.ComponentModel名前空間)を利用することで、メソッドの種類を宣言できる。具体的には、第1引数で「メソッドの種類(SELECT、UPDATE、DELETEなど)」を、第2引数で「デフォルトのメソッドであるか」を、それぞれ指定できる。DataObjectMethod属性の宣言は必須ではないが、明示的に指定しておくことで、データソース構成ウィザードでも対応するメソッドが自動的に認識されるようになる。通常は、きちんと宣言しておくのが望ましいだろう。

(3)メソッドの戻り値はDataTableオブジェクト

 メソッドの戻り値は、型付きデータテーブル(DataTableオブジェクト)として返す必要がある。前回のTIPSで述べたように、ここでは型付きデータセットとして「Book」が、型付きデータテーブルとして「bookDataTable」が生成されているはずだ。

 型付きデータテーブルは「型付きデータセット名.テーブル名」で取得できる。ここでは、テーブル・アダプタ経由で取得した結果セットの内容を型付きデータテーブルに流し込んでいる。

2. GridViewコントロールにデータをバインドする

 作成した部分クラスを保存したら、これをGridViewコントロールにバインドしてみよう。前回のTIPSで作成済みのStored.aspxに配置したGridViewコントロールのタスク・メニューを開き、[データソースの選択]から[<新しいデータソース>]を選択する。データソース構成ウィザードが開くので、以下の表の要領で必要な情報を設定する。

 データアクセス・コンポーネントをバインドする場合の基本的な手順については、前回のTIPSも併せてご参照いただきたい。

項目 概要
データの種類 オブジェクト
データソースID ods
ビジネス・オブジェクトの選択 BookTableAdapters.bookTableAdapter
データ・メソッドの定義(SELECT) GetInfosByPrice(Int32 price)、戻り値bookDataTable
データソース構成ウィザードの設定

 ウィザードの最後に[パラメータの定義]ダイアログが表示されるが、ここではSELECTメソッド(GetInfosByPriceメソッド)の引数priceに対して、RadioButtonListコントロール「rdoExp」を紐付けておこう。これによって、引数priceに対して、RadioButtonListコントロールの選択値(SelectedValueプロパティ)がバインドされるわけだ。

[パラメータの定義]ダイアログ

 以上の手順を終えたら、さっそく、サンプルを実行してみよう。冒頭の画面のように、ラジオボタンの条件指定に従ってグリッド表のデータが絞り込み表示されれば、確かにデータアクセス・コンポーネントと部分クラスは正しくバインドされている。End of Article

利用可能バージョン:.NET Framework 2.0
利用可能バージョン:.NET Framework 3.0
利用可能バージョン:.NET Framework 3.5
カテゴリ:Webフォーム 処理対象:GridViewコントロール
使用ライブラリ:GridViewコントロール
関連TIPS:[ASP.NET]GridViewコントロールでデータソースの内容を表示するには?
関連TIPS:[ASP.NET]GridViewコントロールにストアドプロシージャの結果を反映させるには?

この記事と関連性の高い別の.NET TIPS
[ASP.NET]GridViewコントロールにオブジェクトをバインドするには?
[ASP.NET]GridViewコントロールで大量のデータをページ表示するには?
[ASP.NET]GridView+ObjectDataSourceコントロールでファイル一覧を作成するには?
[ASP.NET]GridViewコントロールにストアド・プロシージャの結果を反映させるには?
[ASP.NET]メンバシップAPIでユーザー情報の編集を行うには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間