連載:VS 2005でいってみようDBプログラミング

第7回 データソース・コントロールでいってみよう(後編)

山田 祥寛(http://www.wings.msn.to/
2006/08/26
Page1 Page2 Page3 Page4

■データアクセス・コンポーネントを拡張する

 以上、TableAdapter構成ウィザードを使って、ウィザード・ベースでデータアクセス・コンポーネントを作成する方法について見てきました。これによって、コーディングレスでデータアクセス部分を実装できますが、これだけではSqlDataSourceコントロールでできることとさほど変わりはありません。

 データアクセス・コンポーネントの特長は、定型的な処理はウィザード・ベースで手軽に実装できると同時に、ウィザード・ベースでは賄えないイレギュラーな要件を手軽に拡張できる、という点にあります。

 以下では、前項で作成したデータアクセス・コンポーネントに対して、自前のデータアクセス・コードを追加してみることにしましょう。

[1]拡張コードを作成する

 自動生成されたデータアクセス・コンポーネント(正確にはテーブル・アダプタ)の機能を拡張するには、部分クラス(Partial Class:パーシャル・クラス)を利用します。

 部分クラスとは.NET Framework 2.0から追加された機能の1つで、1つのクラスの定義を複数に分割できる機能のことをいいます。部分クラスを利用することで1つのクラスを複数のファイルに分割して記述し、コンパイル時に1つのクラスとしてマージすることが可能になります(詳細は、拙稿「VS 2005で新しくなったVisual BasicとC#の新機能を総括」を参照)。

 部分クラスによる拡張コードを作成するには、ソリューション・エクスプローラから「App_Code」フォルダを右クリックし、表示されたコンテキスト・メニューから[新しい項目の追加]を選択してください。

 [新しい項目の追加]ダイアログが表示されますので、表2の要領で入力したうえで、[追加]ボタンをクリックします。

項目 設定値
テンプレート クラス
名前 BooksDataSet.vb
言語 Visual Basic
表2 [新しい項目の追加]ダイアログの入力項目

 コード・エディタが開きますので、リスト1のようにコードを入力してみましょう。なお、このGetBooksDataSetメソッドの中身は、前回のリスト1(Book.vb)のgetBooksDataReaderメソッドの中身とまったく同じです。

Imports Microsoft.Visual Basic
Imports System.ComponentModel
Imports System.Data
Imports System.Data.Common

Namespace BooksDataSetTableAdapters
  Partial Public Class booksTableAdapter
    <DataObjectMethod(DataObjectMethodType.Select, False)> _
    Public Function GetBooksDataSet(ByVal publish As String) As DataSet
      Dim setting As ConnectionStringSettings = _
        ConfigurationManager.ConnectionStrings("MyDB")

      Dim factory As DbProviderFactory = _
        DbProviderFactories.GetFactory(setting.ProviderName)

      Dim db As DbConnection = factory.CreateConnection()

      db.ConnectionString = setting.ConnectionString
      Dim comm As DbCommand = factory.CreateCommand()
      comm.Connection = db

      If publish <> "-" Then
        comm.CommandText = _
          "SELECT * FROM books WHERE publish=@publish"
        Dim param As DbParameter = factory.CreateParameter()
        param.ParameterName = "@publish"
        param.Value = publish
        comm.Parameters.Add(param)
      Else
        comm.CommandText = "SELECT * FROM books"
      End If

      db.Open()
      Return comm.ExecuteReader(CommandBehavior.CloseConnection)
    End Function
  End Class
End Namespace
リスト1 型指定データセットを拡張するためのコード(BooksDataSet.vb)

 自動生成されたテーブル・アダプタは「<.xsdファイル名>TableAdapters」名前空間に属しています。また、TableAdapterクラスの名前は、デフォルトで「<テーブル名>TableAdapter」です。

 部分クラスを定義するには、(当然のことではありますが)元のクラスと同じ名前空間/クラス名で記述する必要があります。部分クラスであることは、Partialキーワードで宣言することが可能です。

 これで、データアクセス・コンポーネントに自作のGetBooksDataSetメソッドが追加されました。

[2]「.aspx」ファイルを修正する

 拡張されたデータアクセス・コンポーネントが正しく動作しているかどうかを確認してみましょう。前回作成したObjectDataSource.aspxを開き、GridViewコントロールのタスク・メニューから[データソースの構成]を選択してください。

 データ構成ウィザードが開きますので、以下の図7のように、ビジネス・オブジェクトとして「BooksDataSetTableAdapters.booksTableAdapter」を、SELECTメソッドとして「GetBooksDataSet(String publish)、戻り値 DataSet」を選択してください。




図7 データソース構成ウィザードのビジネス・オブジェクト選択
ビジネス・オブジェクトとして「BooksDataSetTableAdapters.booksTableAdapter」を、SELECTメソッドとして「GetBooksDataSet(String publish)、戻り値 DataSet」を選択する。

 前回同様、プルダウン・メニューの選択に応じてbooksテーブルの内容が選択表示されれば成功です。最終的な完成コードは、サンプル・プログラム内のTypedDataSetEx.aspxに含まれていますので、適宜参考にしてください。

 いかがですか? このように、Visual Studio 2005のデータアクセス・コンポーネントの自動生成機能を利用することで、ウィザード・ベースの高い開発生産性と、部分クラスによる高度な柔軟性を実現できるというわけです。

[コラム]自動生成されたデータアクセス・コンポーネントをコードから利用する

 もちろん、DataAdapter構成ウィザードによって自動生成されたデータアクセス・コンポーネントは、コード中からも利用することが可能です。例えば、以下はbooksテーブルの1行目からisbnフィールドの値を取り出すためのコードです。

Dim adapter As New BooksDataSetTableAdapters.booksTableAdapter
Dim ds As New BooksDataSet()
adapter.Fill(ds.books)
Response.Write(ds.books(0).isbn)
自動生成されたデータアクセス・コンポーネントの利用
booksテーブルの1行目からisbnフィールドの値を取り出している。

 ちなみに、データ取り出しの部分では、以下のようなコードを記述することも可能です。


Response.Write(ds.Tables("books").Rows(0)("isbn"))

 しかし、この場合、テーブル/フィールド名を単なる文字列として指定しているため、「コーディング時にIntelliSense機能を利用できない」「指定された名前に誤りがあってもコンパイラが検出できない」などの問題があります。特別な理由がない限り、前者のような記法で記述することを強くお勧めします。


 INDEX
  Visual Studio 2005でいってみようDBプログラミング
  第7回 データソース・コントロールでいってみよう(後編)
    1.Visual Studioでデータアクセス・コンポーネントを自動生成(1)
  2.Visual Studioでデータアクセス・コンポーネントを自動生成(2)
    3.Microsoft Accessに特化したAccessDataSourceコントロール
    4.XMLデータを操作するXmlDataSourceコントロール
 
インデックス・ページヘ  「Visual Studio 2005でいってみようDBプログラミング」


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 記事ランキング

本日 月間