ASP.NET 2.0 におけるデータ アクセス

Jayesh Patel, Bryan Acker, Robert McGovern
Infusion Development

July 2004

適用対象 :
   Microsoft ASP.NET 2.0
   Microsoft ADO.NET 2.0
   Microsoft Visual Studio 2005

概要 : ASP.NET 2.0 は、多数のデータ対応コントロールを追加することによって、データ アクセスにおける一般的なタスクを実行するために必要なコード量を削減しています。この記事では、これらの新しいコントロールについて紹介し、各コントロールをアプリケーションで使用する方法について説明します。

目次

はじめに
Web アプリケーションを対象とするデータ アクセス
ASP.NET データ コントロール
AccessDataSource
SqlDataSource
ObjectDataSource
DataSetDataSource
XmlDataSource
SiteMapDataSource
GridView の設定
ASP.NET 2.0 の新しいデータ機能
まとめ

はじめに

Web アプリケーションの開発において、常に重要な側面となってきたのがデータ アクセスです。大部分のビジネス アプリケーションでは、データ ドリブンな Web ページが欠かせないものとなっています。データ アクセスは非常に一般的なものであり、単純なデータベース タスクのために複雑なコードを頻繁に作成することは、開発者にとってほとんど時間の無駄でしかありません。開発者は、さまざまなソースからさまざまなフォーマットのデータにすばやくアクセスできる必要があります。さいわいなことに、ADO.NET 2.0 および ASP.NET 2.0 の新しいコントロールがこうした問題の解決に役立ちます。

従来の ASP および ASP.NET 1.1 を対象としたアプリケーションでは、開発者がコードを作成して、データベースへのアクセス、データの更新、ブラウザ フレンドリな HTML への取得データの変換などを処理する必要がありました。Visual Studio .NET にはこれらの作業に役立つウィザードが用意されていましたが、ページングや並べ替えなど高度な機能を実現するためには、バックエンドのコードとフロントエンドの画面表示との間で複雑な同期処理を行う必要がありました。このコードの保守および同期が困難になることも多く、データベースが変更された場合や、ページに表示するデータを追加した場合などは特に厄介でした。さらに、データ ストアとしての XML の普及に伴い、データ アクセスのためのロジックが入り混じった大量のコードを追加する必要が生じました。

開発者の生産性および Web アプリケーションのパフォーマンスの向上を目的として、ASP.NET 2.0 では、データ処理についてさらなるコントロールと柔軟性をもたらす新しいデータ コントロールに機能をカプセル化し、データへのアクセスとその表示に必要なコード量を削減します。これらのコントロールは、従来のデータベースから XML データ ストアまで、さまざまなデータ ソースにリンクできます。データ ソースはすべて同一の方法で処理されるため、データ ドリブン アプリケーションの開発における複雑さが大幅に緩和されます。ASP.NET 2.0 がこれらの機能を内部的にサポートするためには、アーキテクチャの大幅な拡張が必要となりました。新しいデータ ソース オブジェクトには、非常に堅牢な基盤を強化するために、さまざまな業界で受け入れられているベスト プラクティスが組み込まれています。ASP.NET 2.0 が提供するデータ アクセス ツールは、現在では、最も複雑なアプリケーションで活用できるものとなりました。ASP.NET 1.x の実装では制限されていたデータ連結やキャッシングの問題は、ASP.NET 2.0 ではアーキテクチャ的にも機構的にも解消されています。

読者が ASP 開発者であれば、このホワイト ペーパーによって、ASP.NET 2.0 で可能になった新しいデータ アクセス機能と ADO.NET 2.0 のデータ アクセス モデルについての情報が得られます。読者が ASP.NET 1.1 の開発者であれば、ADO.NET およびデータ アクセス モデルに対して加えられた追加的な変更点の概要を知ることができます。さらに、ASP NET 2.0 の新しいデータ アクセス コントロールを使用することによって、データ ドリブンな Web アプリケーションの開発に必要なコード量がどのようにして削減されるかについても理解できます。

Web アプリケーションを対象とするデータ アクセス

.NET Framework では、ADO.NET API を使用してデータ アクセスが実行されます。データベースとの直接的な対話は時に煩雑な処理となる場合がありますが、この API が提供する抽象化層によってこうした処理をカプセル化して隠すことができます。ADO.NET 上でビルドされる ASP.NET 2.0 Web アプリケーションは、さまざまな種類のデータに対する接続を自動的に作成するサービスの提供、データへのユーザー コントロールの連結、データを意識した Web アプリケーションの開発に必要なコード量の削減を行います。

データ アクセス アーキテクチャ

.NET Framework における Web アプリケーションのデータ アクセスは、2 つの個別なアーキテクチャ層に依存しています。最初のレイヤは、データ アクセスの実行に必要なフレームワーク コンポーネントから構成されています。2 つ目のレイヤは、プログラマにデータ アクセス機能を提供する API やコントロールから構成されています。実用的な観点から考えた場合、データ プロバイダについて知っておくべき点は、使用する特定のデータ ソースに対応するプロバイダを見つけられるかどうかということだけです。

データ アクセスに関連する主要なコンポーネントとして、Web アプリケーション (ASP.NET)、データ層 (ADO.NET)、データ プロバイダ、および実際のデータ ソースの 4 つが挙げられます。データを意識したすべての Web アプリケーションの基盤は、これらのコンポーネントの連携によって提供されます。

Dd229398.dataaccessaspnet2_fig01(ja-jp,MSDN.10).gif
図 1. コンポーネントのアーキテクチャ

データ ストア

最も下のスタックから見ていくことにしましょう。データ アクセス アーキテクチャ全体の目的となるのがこのデータ ストアです。ADO.NET 2.0 および ASP.NET 2.0 の新しいコントロールを使用することにより、リレーショナル データベース、XML ファイル、Web サービス、フラット ファイル、Microsoft Excel のような表計算プログラムのデータなど、さまざまなデータ ストアのデータに Web アプリケーションからアクセスできるようになります。実質的には、データ ソースが実際に何であるかは、データの読み取りや操作に使用されるメカニズムほど重要ではありません。

データ プロバイダ

プロバイダ モデルにより、1 セットのクラスとコマンドを使用するだけで、ADO.NET をさまざまなデータ ソースと対話させることができます。プロバイダは、特定のデータ ソースに対してデータの保存機能や取得機能を提供するインターフェイスとクラス フックのセットを定義します。このモデルの柔軟性により、開発者はデータ アクセス コードを (ADO.NET を使用して) 1 セット記述するだけで、複数の種類のデータにアクセスできます。

ASP.NET 2.0 では、基本的なデータ アクセス以外のさまざまなタスクにプロバイダ モデルが実際に使用されています。たとえば、新しいパーソナライゼーション機能では、ユーザー データの格納処理に数種類のプロバイダを使用しています。したがって、プロバイダの実際の構造は機能に依存することになります。メンバーシップ プロバイダは、データ アクセス プロバイダとは異なる目的で機能します。

ADO.NET データ プロバイダを構成する 4 つのコア オブジェクトを以下の表に示します。

表 1. ADO.NET データ プロバイダのコア オブジェクト

オブジェクト 説明
Connection 指定されたリソースへの接続を確立します。
Command データ ソースに対してコマンドを実行します。Parameters を公開し、また Connection からのTransaction スコープ内で実行できます。
DataReader 前方参照のみ、読み取り専用のデータ ストリームをデータ ソースから読み込みます。
DataAdapter DataSet を作成し、データ ソースの更新を解決します。

プロバイダ モデルは明確な役割分離のために設けられています。ASP.NET の開発者は機能的で人に優しいユーザー インターフェイスの開発に集中できます。一方、バックエンドの開発者は既存のエンタープライズなデータ ソースとの複雑な統合を実装できます。このプロバイダ モデルにより、エンタープライズ Web アプリケーションの開発において、ASP.NET 2.0 は優れた選択肢となります。

ADO.NET API

ADO.NET API が定義する抽象化層によって、すべてのデータ ソースが同一のものとして見なせるようになります。データ ソースの違いにかかわらず、情報の抽出に使用される手順には同一のキー クラスとステップが含まれます。次のセクションでは、ADO.NET の処理について詳細に見ていきます。

Web アプリケーション層

最上部のスタックには ASP.NET が提供する一連のコントロールが位置しています。これらのコントロールは、記述が必要なデータ アクセス コードの量を最小化することを目的にデザインされています。たとえば、開発者がデータ ソース ウィザードを実行すると、クエリの発行と結果の取得に使用可能なデータ ソースが自動的に作成および設定されます。また、さまざまなコントロールをデータ ソースに連結することによって、データ ソースから取得した情報を基にコントロールの外観と内容を自動的に設定できます。

これらのコントロールは、グリッド、ツリー、メニュー、リストなどを含む、あらゆるシェイプとサイズで設定されます。データ連結コントロールは、DataSourceID プロパティを使用してデータ ソースに接続します。このプロパティは、デザイン時または実行時に宣言できます。

データ ソース コントロールは、ADO.NET が提供するプロバイダなどを介して、基となっているデータ ストアに連結されます。データ ソース コントロールの利点は、ページ内に宣言で指定できることにあります。さらに、ページング、並べ替え、更新などの処理を実行するための機能を、コードを 1 行も記述することなく公開できます。

データ アクセス API

2 番目のアーキテクチャ層では、プロバイダ、ADO.NET、および ASP.NET コントロールと連携するための共通のメカニズムが提供されます。このアーキテクチャには、共通のタスクと処理がいくつか含まれています。ただし、開発者の視点から考えると、ASP.NET 2.0 で利用できるさまざまなデータ連結コントロールやデータソース コントロールを使用することで、これらの処理をサポートするコードを記述する必要がなくなる場合もしばしばあります。

Connection と Command

ADO.NET には .NET Framework データ プロバイダが用意されており、データベースとの接続、コマンドの実行、および結果の取得に使用できます。ADO.NET では、Connection オブジェクトを使用して特定のデータ ソースに接続します。たとえば、SQL Server 2000 では、SQLConnection オブジェクトを使用してデータベースに接続します。コード例を以下に示します。

[Visual Basic]
Dim nwindConn As SqlConnection = _
  New SqlConnection("Data Source=localhost;Integrated Security=SSPI;" _
  "Initial Catalog=northwind")
nwindConn.Open()

[C#]
SqlConnection nwindConn = 
  new SqlConnection("Data Source=localhost; Integrated Security=SSPI;"
  "Initial Catalog=northwind");
nwindConn.Open();

データ ソースへの接続が完了したら、Command オブジェクトを使用して、コマンドの実行と結果の取得を行うことができます。コマンド オブジェクトの作成には、SQL ステートメントまたはクエリを受け取る Command コンストラクタを使用します。Command の作成を終えたら、CommandText プロパティを使用して SQL ステートメントを変更できます。

Visual Basic]
Dim catCMD As SqlCommand = _
  New SqlCommand("SELECT CategoryID, CategoryName FROM Categories", 
    nwindConn)

[C#]
SqlCommand catCMD = 
  new SqlCommand("SELECT CategoryID, CategoryName FROM Categories", 
    nwindConn);

コマンドは、特定のデータベースに結び付けられた特殊な SQL 呼び出しとして考えることができます。このコマンドは、CommandText フィールドで定義された特定の呼び出しのためにのみ使用できます。

Command オブジェクトには、種類の異なる Execute メソッドがいくつか用意されており、ストアド プロシージャの起動、クエリの実行、または更新や挿入など非クエリ ステートメントの実行に使用できます。

  1. ExecuteReader メソッド—データを DataReader オブジェクトとして返します。データを返すあらゆる SQL クエリで使用されます。
  2. ExecuteScalar メソッド—特定のクエリに一致するレコード数やデータベース関数呼び出しの実行結果など、単一の値を返します。
  3. ExecuteNonQuery メソッド—行を返さないコマンドを実行します。ストアド プロシージャ、挿入、更新などの処理で通常使用されます。

当然ですが、Command オブジェクトの初期化時に作成したコマンドを基に、適切な Execute メソッドを選択する必要があります。

ExecuteReader メソッドは、結果をすべて DataReader オブジェクトに返します。DataReader オブジェクトは、接続型、前方参照のみ、読み取り専用のデータ ストリームで、データベース クエリから返されます。クエリが実行されると、最初の行が DataReader に返されます。データ ストリームとデータベースの接続はそのまま継続され、次のレコードを返すことができます。DataReader にデータベースの行が読み込まれると、各行の列の値を読み込んだり、評価したりできますが、値を変更することはできません。

DataAdapter と DataSet

DataReader は、接続型アプリケーションに対しては十分な機能を果たしますが、非接続型のデータベース アクセス モデルは完全にはサポートしていません。非接続型のデータベース アクセスについては、DataAdapter クラスおよび DataSet クラスが用意されています。

ADO.NET の非接続型アーキテクチャにおいて、主なデータ ストレージ ツールとして使用されるのが DataSet です。DataSet は、作成時に Connection オブジェクトを介して直接データベースに接続されるわけではありません。DataSet にデータを格納するには、DataAdapter を作成する必要があります。DataAdapter はデータベースに接続して、クエリを実行し、DataSet を作成します。データの転送はすべて、DataAdapterFill メソッドまたは Update メソッドを呼び出すときに背後で実行されます。.NET Framework の各データ プロバイダには、DataAdapter オブジェクトが用意されています。

DataSet は、テーブル、制約、テーブル間のリレーション シップなどを含む完全なデータ セットを表します。DataSet は、コードから作成したローカル データや複数のデータ ソースからのデータを格納でき、データベースとは非接続です。

既存のデータ ソースとのやり取りは、DataAdapter によって制御されます。DataAdapter を使用すると、DataSet に対して加えられた変更内容をデータ ソースに戻すこともできます。DataSet の典型的なシナリオを以下のコードに示します。

[Visual Basic]
Dim nwindConn As SqlConnection = _
  New SqlConnection("Data Source=localhost;" & _
  "Integrated_Security=SSPI;Initial Catalog=northwind")

Dim selectCMD As SqlCommand = _
  New SqlCommand("SELECT CustomerID, CompanyName FROM " & _
  "Customers", nwindConn)
selectCMD.CommandTimeout = 30

Dim custDA As SqlDataAdapter = New SqlDataAdapter
custDA.SelectCommand = selectCMD
Dim custDS As DataSet = New DataSet
custDA.Fill(custDS, "Customers")
nwindConn.Close()

[C#]
SqlConnection nwindConn = 
  new SqlConnection("Data Source=localhost;" +
    "IntegratedSecurity=SSPI;Initial Catalog=northwind");
SqlCommand selectCMD = 
  new SqlCommand("SELECT CustomerID, CompanyName FROM Customers",
                       nwindConn);
selectCMD.CommandTimeout = 30;

SqlDataAdapter custDA = new SqlDataAdapter();
custDA.SelectCommand = selectCMD;
nwindConn.Open();
DataSet custDS = new DataSet();
custDA.Fill(custDS, "Customers");
nwindConn.Close();

上記のコードでは以下の処理を行っています。

  1. SQLConnection を作成して、SQL Server データベースに接続します。
  2. SQLCommand を作成して、Customers テーブルにクエリを実行します。
  3. DataAdapter を作成して SQLCommand を実行し、接続型のデータ操作を行います。
  4. DataAdapter から DataSet を作成します。DataSet は非接続型のデータ操作に使用され、ASP.NET 2.0 の広範な Web コントロールに連結できます。

作成した DataSet は、あらゆる種類の、データを意識したコントロールに連結できます。データの連結には、各コントロールの DataSource プロパティと DataBind() メソッドを使用します。残念ながら、データが変更された場合には、DataBind() を再度呼び出して、データセットを再連結する必要があります。したがって、ASP.NET 1.x の開発者は、連結メソッドをいつどこで呼び出すかを厳密に把握して考慮する必要があります。同期を適切に行うためのメソッドやイベントの開発はかなり困難な作業となることが考えられます。

ASP.NET 2.0 では、データ ソースというコンセプトのおかげで、DataSet の作成、連結、およびデータ同期の維持という一連の処理が大幅に単純化されています。

ASP.NET 2.0

ASP.NET 2.0 では、基本モデルがいくつかの点で大きく変更されています。最も大きな変更点は、SQLCommand の作成、DataAdapter の生成、および DataSet へのデータの格納が、DataSource によって隠される、またはデータ連結ウィザードによって自動的に構成されることです。

Configure DataSource ウィザードを使用すると、データ ソース (データベース、フラット ファイル、XML、オブジェクト) に接続するためのコード生成およびクエリ作成が行われ、開発者はいくつかの簡単なステップを実行するだけでパラメータを指定できます。

データ ソースの作成を終えたら、次にそのデータ ソースをコントロールにリンクします。このリンクはデータ連結と呼ばれています。データ ソースから抽出した値は、コードを一切記述せずにコントロールのプロパティにリンクしたり、テーブル、リスト、またはグリッドの値として使用したりできます。

ASP.NET データ コントロール

ASP.NET 1.1 は、ADO.NET API との連携およびデータ アクセスの単純化を目的としてデザインされました。ADO.NET 2.0 では、データを意識したアプリケーションを迅速かつ容易な手順で開発するためにデザインされた、新しい一連のコントロールやウィザードを使うことで、単純化やコードの簡素化がさらに推し進められています。

DataSource コントロール

ASP.NET 2.0 データ アクセス システムにおいて中心的な役割を果たすのが DataSource コントロールです。DataSource はその背後にあるデータ ストア (データベース、オブジェクト、XML、メッセージ キューなど) を表しており、Web ページ上に宣言文として記述できます。DataSource はページ上に表示されることはありませんが、これによりデータ連結用の UI コントロールへのアクセスが行われます。DataSources との連携、自動データ連結の利用、データ変更をコントロールに通知するイベント モデルなどのために、さまざまな UI コントロールについてデザインの見直しが行われています。また、データ ソースでは、追加コードを一切記述せずに並び替え、ページング、更新、削除、挿入などの機能を公開できます。

結局、DataSource コントロールが公開しているのはすべて汎用的なインターフェイスです。そのため、データ連結コントロールは、接続先がデータベースなのか、または XML ファイルなのかを認識する必要がありません。ただし、各 DataSource はデータ ソース固有のプロパティも公開しており、それらは開発者にとって直感的に扱えるものとなっています。たとえば、SqlDataSourceConnectionString プロパティと SelectCommand プロパティを公開しています。一方、XMLDataSource はソース ファイルやスキーマを定義するプロパティを公開しています。すべてのデータ ソースは、データの取得に必要なプロバイダ固有の ADO.NET 基本オブジェクトを水面下で作成します。

DataSource の作成

DataSource のサブクラスは、ASP.NET 2.0 で最も強力な、新しいデータ コントロールの一部です。これらを使用すると、データベースやXML ファイルなどのデータ ソースへの接続を宣言によって構成できます。これらのコントロールにより、カスタム コードを記述することなく、データ ソースからのデータの取得や更新を行うことができます。Configure DataSource ウィザードではグラフィカルなインターフェイスが提供され、そこでプログラマはいくつかの簡単なステップを実行するだけで、データ ソースを構成するための適切な詳細を定義できます。ASP.NET 2.0 では、リソースに接続するためのコードが自動的に生成され、また必要に応じて、クエリに基づいたパラメータが作成されます。自動生成されたコードは .ASPX ファイルに保存されます。たとえば、.ASPX ファイルに保存された SQLDataSource のコードには、接続文字列や SQL ステートメントなどの属性が含まれます。

<asp:sqldatasource 
  id="SqlDataSource1" 
  runat="server" 
  selectcommand="select customerid, companyname from customers"
  providername="System.Data.OleDb"     
     connectionstring="Provider=SQLOLEDB.1;Integrated Security=SSPI;
     Initial Catalog=Northwind; Data Source=localhost; 
     Auto Translate=True; Use Encryption for Data=False>
</asp:sqldatasource>

もちろん、開発者は必要に応じてこのコードを変更できます。たとえば、プロバイダ名を web.config ファイルや別の中央の管理場所などに移動できます。

データ ソースの種類

ASP.NET 2.0 には数種類のデータ ソース オブジェクトが用意されており、これらを使用することで、データ連結コントロールの共通のインターフェイスとなるフレームワークを構成できます。データ ソース オブジェクトは、データベースやメモリ内オブジェクトから XML ファイルに至るまでの異なる基本構造の操作や、コントロールに対する抽象的なデータ操作機能の提供に使用されます。

AccessDataSource

アプリケーションで Microsoft Access データベースを利用している場合、System.Web.UI.WebControls.AccessDataSource を使用することで、データ操作の挿入、更新、および削除を実行できます。Access データベースは、基本的なリレーショナル ストレージを提供する最小限のデータベースです。Access は単純で使いやすいデータベースですが、さまざまな小規模 Web サイト用のデータ ストレージ層を形成しています。Access は SQL Server のようなリレーショナル データベースの完全な機能を備えているわけではありませんが、単純で使いやすいため、プロトタイプや RAD (rapid application development) シナリオで使用すると非常に効果的です。

SqlDataSource

Microsoft SQL Server の強力な機能を利用した、さらに堅牢なデータベースの実装については、ASP.NET 2.0 で SQLDataSource が提供されます。SQLDataSource は真のデータベース管理システム (DBMS) の機能を必要とするエンタープライズ アプリケーションを対象としており、AccessDataSource よりも複雑な設定が必要となります。

ObjectDataSource

カプセル化および抽象化を向上させるためにデータ アクセス層を実装する必要がある場合は、System.Web.UI.WebControls.ObjectDataSource を使用します。ObjectDataSource コントロールは、データベースに対してではなく、特殊なデータ層に対して連結を行います。データ層への連結方法は、他のコントロールを使用してデータベースに連結する場合と同様です。ObjectDataSource コントロールは、DataSet または IEnumerable オブジェクト (DataReader やクラス コレクションなど) を返す任意のメソッドに連結できます。

<asp:objectdatasource 
     id="ObjectDataSource" 
     runat="server" 
     typename="DAL.Customers"
     selectmethod="GetOrders"> 
</asp:objectdatasource>

ObjectDataSource では、データ アクセス層を利用する場合とまったく同じ方法で Web サービスのプロキシを利用できます。言い換えると、ObjectDataSource を使用すると、適切にデザインされた Web サービスをリレーショナル データベースと同じ方法で処理できるということです。

DataSetDataSource

System.Web.UI.WebControls.DataSetDataSource コントロールを使用すると、表形式の XML データを利用できます。表形式のデータは行と列から構成されます。

<?xml version="1.0"?>
<collection>
  <book>
    <title>cosmos</title>

    <author>carl sagan</author>
    <publisher>ballantine books</publisher>
  </book>
  <book>
    <title>catwings</title>

    <author>ursula k. le guin</author>
    <publisher>scholastic</publisher>
  </book>
</collection>

DataFile プロパティに XML ファイルを指定するだけでデータを利用できるようになります。

<asp:datasetdatasource id="Datasetdatasource1" runat="server"
                       datafile="collection.1ml"
/>

データ ソースは DataGrid など表形式の任意のコントロールに連結できます。

XmlDataSource

XML データは、半構造型または階層型のデータを表現するのに使用されるのが一般的です。データ ソースとして XML ファイルを使用することで、他のソース (他の企業や既存のアプリケーションなど) から XML ドキュメントを受け取ったり、アプリケーションと互換性のある形式に XML データをフォーマットしたりできます。

System.Web.UI.WebControls.1mlDataSource を設定するには、XML ファイルへのパスを指定する必要があります。また、XML によって変換が要求される場合は、XSLT スタイル シートまたは XPath クエリへのパスをオプションで指定する必要もあります。

<asp:XmlDataSource
    ID="XmlDataSource1"
    Runat="server"
    DataFile="~/xml/fruits.xml">
</asp:XmlDataSource>

XMLDataSource は、ツリー ビューやデータ リストなど階層型のコントロールと併用するのが最適です。

<asp:TreeView
    ID="TreeView1"
    Runat="server"
    DataSourceID="XmlDataSource1"
    ShowLines="True">
</asp:TreeView>

上記の 2 つのリストは、図 2 のような XML 階層構造を表示する XmlDataSourceTreeView の両方のコントロールの宣言型構成を説明しています。

Dd229398.dataaccessaspnet2_fig02(ja-jp,MSDN.10).gif
図 2. TreeView コントロール

TreeView コントロールにより、ユーザー インターフェイス作成用のマークアップが自動的に生成され、ユーザーが親エンティティをクリックするとノードが展開されます。この TreeView コントロールは、XMLDataSource によって fruits.xml ファイルに連結されています。

SiteMapDataSource

System.Web.UI.WebControls.SiteMapDataSource コントロールを使用すると、Web サイトのナビゲーションを物理的ではなく論理的に実装できます。論理構造を作成すると、ファイルの物理的な位置が変更された場合でも、ナビゲーションは影響を受けません。ページの物理的な位置は、アプリケーションのナビゲーションを再構築せずに変更できます。

SiteMapDataSource を使用する場合の最初のステップは、SiteMapNode 要素の階層構造をマップする XML ファイルを作成して、サイトのナビゲーション構造を指定することです。この XML ファイルは app.sitemap という名前で保存されます。

<?xml version="1.0" encoding="utf-8" ?> 

<siteMap> 
   <siteMapNode title="Northwind" description="Northwind" url="root.aspx"> 
      <siteMapNode title="Products"
        description="Product Line" url="Products.aspx"> 
         <siteMapNode title="Beverages" 
           description="Tasty Beverages" 
                      url="Beverages.aspx" /> 
      </siteMapNode> 
   </siteMapNode> 
</siteMap> 

SiteMapDataSource がアプリケーションで使用されると、特定の app.sitemap ファイルが検索されます。SiteMapDataSource は、ナビゲーション コントロールにこれらのファイルをリンクして、論理ナビゲーションを実装できます。

Dd229398.dataaccessaspnet2_fig03(ja-jp,MSDN.10).gif
図 3. Home-> Articles-> Article 2 のページ を表すブレッドクラム経路

データの連結

データ ソースの作成を終えたら、次にそのデータ ソースをコントロールにリンクします。このリンクはデータ連結と呼ばれています。ASP.NET v1.x には、DataGridDataListDropDownList などのデータ連結コントロールが用意されていました。ASP.NET 2.0 では、以下に示すいくつかの重要なイノベーションによって、データ連結コントロールのコンセプトに対する改善が行われています。

  1. 新しいデータ連結コントロールは、データ ソース コントロールとの連結時に DataSourceID プロパティを使用して自動的に自分自身をデータ連結します。これにより、ページ開発者がページのライフサイクルを理解して、適切なタイミングで DataBind() を明示的に呼び出す必要がなくなります。データ連結コントロールはこの機能を自動的に実行するだけでなく、データ ソースのイベント変更を監視することさえもできます。
  2. ASP.NET 2.0 に新たに追加されたデータ連結コントロールは、並び替え、ページング、更新、挿入、削除などデータ ソースの機能を自動的に利用できます。

ASP.NET v1.x では、ページ開発者がデータ連結コントロールのイベントを手作業で処理して、それらの操作を実行するコードを記述する必要がありました。ASP.NET 2.0 では、データ連結コントロールがデータ ソースの機能を直接利用できます。もちろん、ページ開発者は今までと同様に、適切なイベントを利用することでそれらの操作 (たとえば入力の検証など) の処理をカスタマイズすることもできます。

ASP.NET 2.0 では、さまざまなコントロールに対する豊富なデータ連結がサポートされています。たとえば、<ASP:DropDownList><ASP:DataList><ASP: GridView> などを含む多数のデータ コントロールに XML データ ソースを連結できます。

ASP.NET 2.0 におけるデータ連結

従来のアプリケーションでデータ連結を行う場合、数行のコードを記述する必要があります。たとえば、従来の ASP を使用してドロップ ダウン リストを作成する場合、値をページ上にハードコーディングするか (以下に例を示します)、またはデータベースへの接続、データの取得、およびドロップ ダウン リストの作成を行うためのコードを記述する必要がありました。ドロップ ダウン リストを手作業で作成した場合、データが更新されるたびに手作業でコードを変更する必要があります。

<select size="1" name="dropdown_menu">
  <option value="1" >test_data1</option>
  <option value="2">test_data2</option>
  <option value="3">test_data3</option>

  <option value="4">test_data4</option>
</select>

データベース テーブルにアクセスしてリストを作成する場合、情報を取得するためのコードを記述する必要があるだけでなく、ページがロードされるたびにアプリケーションからデータベースにアクセスするか、アプリケーション レベルまたはセッション レベルで情報をキャッシュする必要があります。

一方、ASP.NET 1.1 では、コントロールをデータベース テーブルや XML ドキュメントに連結できます。ただし ASP.NET 1.1 では、XML データ ソースに連結する場合は、既に説明したとおり XML を DataSet に変換する必要があります。DataSet への変換が完了したら、後は DataSet をコントロールに連結するだけです。

//C# コード
listbox.DataSource = dataset.Tables[0];
listbox.DataTextField = "Name";
listbox.DataValueField = "ID";
listbox.DataBind()

//VB コード
listbox.DataSource = dataset.Tables(0)
listbox.DataTextField = "Name"
listbox.DataValueField = "ID"
listbox.DataBind()

残念ながら、XML ソースが更新されるたびに、コントロールを新しい DataSet に再連結する必要があります。これは、DataSet がソース ファイルに動的に接続されていないためです。

ASP.NET 2.0 におけるコントロールの連結

ASP.NET 2.0 では、コードを一切記述することなく、ドロップダウン リストを XML ソースまたはデータベースに連結できます。基となるデータが更新されると、キャッシュに格納されている値が必ず自動的に更新されます。

コントロールを連結するには、最初にデータ ソースを作成する必要があります。データ ソース定義のコードを手作業で記述するか、または Configure Data Source ウィザードを使用します。

Dd229398.dataaccessaspnet2_fig04a(ja-jp,MSDN.10).gif
図 4a. Configure ObjectDataSource ウィザード

Dd229398.dataaccessaspnet2_fig04b(ja-jp,MSDN.10).gif
図 4b. Configure XmlDataSource ウィザード

Configure XMLDataSource ウィザードを実行すると、以下のコードが Web.config ファイルに生成されます。

<asp:xmldatasource id="XmlDataSource1" 
  datafile="msdn.1ml" 
  xpath="rss/channel/item" 
  runat="server" 
/>

データ ソースの設定が完了したら、データをコントロールに連結できます。以下のコードでは、XML データ ソースをドロップ ダウン リスト コントロールに連結しています。

<asp:dropdownlist id="DropDownList1" runat="server" 
datatextfield="state" datasourceid="XMLDataSource1" 
autopostback="true" />

データ連結における ASP.NET 1.x と ASP.NET 2.0 の主な違いは、プロバイダ モデルが変更データの同期を自動的に行う点だということに注意してください。言い換えると、データ ソースのデータが変更された場合でも、データ ソースに組み込まれたイベント モデルのおかげで、連結コントロールが自動的に更新されるということです。

データ連結コントロール

ASP.NET 2.0 には、データ表示用の新しいコントロールがいくつか導入されています。これらの新しいコントロールでは、ASP.NET 1.1 に用意されていた DataGrid コントロールの拡張機能が提供されます。

GridView コントロール

ASP.NET 1.1 の DataGrid コントロールは非常に強力で柔軟なコントロールで、大量のコードを記述せずに構造化されたデータを表示できます。残念ながら、DataGrid の内容を操作する (返される行の編集や並び替えなど) 場合は、相当量のコードを記述してコントロールをカスタマイズし、これらの操作を実行できるようにする必要があります。

GridView コントロールは DataGrid に似ていますが、段階的なウィザードを実行してコントロールを宣言で設定することにより、複数ページでの行の編集や表示など一般的なタスクを実行できるようになります。

GridView の設定

この機能をどれだけ簡単に実装できるかを示すため、ドロップダウン リストの選択を基にクエリを実行し、その実行結果を画面に表示する例について考えてみましょう。GridView コントロールをページ上に単純にドラッグし、ドロップダウン リストの選択を基にしたクエリ結果を自動的に表示するようにコントロールを設定します。

Dd229398.dataaccessaspnet2_fig05(ja-jp,MSDN.10).gif
図 5. ドロップダウン リストへの GridView の連結

GridView コントロールを設定するには、Configure Data Source ウィザードを使用してそれをデータ ソースに連結する必要があります。DataGrid オブジェクトで使用可能な Enable Paging、Enable Sorting、および Enable Selection の各オプションを図 6 に示します。

[Configure Data Source] ウィンドウで、適切なテーブルと任意の要素を選択します。 ウィンドウの下部には、自動生成された SQL クエリが表示されます。

拡大するにはここをクリックしてください。
図 6. SQL データ ソースの編集

次に [WHERE] ボタンをクリックして、GridView で表示するレコードの基準を設定します。以下のウィンドウで、[patientID] 列を選択し、演算子とソース オプションを設定します。 ソースを [Control] に設定すると、現在のページにあるすべてのコントロールを対象にして Parameter properties の Control ID フィールドが自動的に作成されます。 連結するコントロールをリストから選択します。パラメータを設定し、必要に応じて既定値が入力されたら、[Add] ボタンをクリックし、[OK] ボタンをクリックして確認します。

Dd229398.dataaccessaspnet2_fig07(ja-jp,MSDN.10).gif
図 7. [Query Editor] ダイアログ ボックス

生成された select ステートメントが [Configure DataSource] ウィンドウに表示されます。

ASP および ASP.NET アプリケーションでは、これらの処理を実行するためのコードと、結果を適切な書式で表示するための HTML コードを記述する必要がありました。新しい GridView コントロールでは、追加コードを記述することなく、以下の結果が生成されます (Edit リンクおよび Delete リンクが自動的に表示されること、および SQL が自動的に生成されることに注意してください)。

Dd229398.dataaccessaspnet2_fig08(ja-jp,MSDN.10).gif
図 8. ドロップダウンに連結された GridView コントロールの表示結果

DetailsView コントロール

DetailsViewGridView コントロールによく似たコントロールであり、その設定方法もまったく同じです。GridView コントロールでは 1 ページに複数のレコードが表示されますが、DetailsView コントロールでは 1 回に 1 つのレコードしか表示されません。

Dd229398.dataaccessaspnet2_fig09(ja-jp,MSDN.10).gif
図 9. DetailsView コントロールにおけるレコード表示

したがって、GridView コントロールは、GridView コントロールの補完として使用すると効果的です。DetailsViewGridView にリンクできます。これによって、個々のアイテムの更新または新規アイテムの挿入をいつどのようにして行うか、よりうまく制御できるようになります。

FormView コントロール

上記と同様のステップに従うことにより、ASP.NET に追加されたもう 1 つのコントロールである FormView を設定できます。FormView コントロールを使用すると、UI を配置する際の柔軟性が大幅に拡張されます。以下の例では、FormView コントロールを使用して、データベースの単一レコードを表示しています。

Dd229398.dataaccessaspnet2_fig10(ja-jp,MSDN.10).gif
図 10. FormView ItemTemplate の出力

ItemTemplateEditItemTemplate など異なるテンプレートを使用して、データベースのレコードを表示したり、変更したりできます。この際にカスタムコードを記述する必要は一切ありません。

Dd229398.dataaccessaspnet2_fig11(ja-jp,MSDN.10).gif
図 11. FormView EditTemplate の出力

ASP.NET 2.0 の新しいデータ機能

ASP.NET 2.0 には、前のセクションで説明した新しいコントロールに加えて、データ ドリブン アプリケーションのパフォーマンスおよびセキュリティ強化を目的としたデータ アクセス関連の新機能がいくつか用意されています。

パフォーマンス

Web アプリケーションのパフォーマンスは、一般に以下の 2 つの方法で改善できます。1 つは、Web アプリケーション層にできるだけ多くのデータをキャッシュすることです。これによって、データ層に対する不要な呼び出しをなくすことができます。もう 1 つは、データ層に対する Web アプリケーション呼び出しの回数およびサイズをできる限り削減することです。

データ ソース キャッシング

SQLDataSource および ObjectDataSource はデータ レベルのキャッシングをサポートします。データ ソース オブジェクトのプロパティをいくつか設定することにより、プログラマはカスタム コードを一切記述することなくキャッシング API を利用できるようになります。基本ストレージ メカニズムの一貫性は、データ ソース オブジェクトによって自動的に管理されます。

SQL のキャッシュ依存関係

大部分のデータ ドリブン Web サイトにとって、データのキャッシングは複雑なタスクとなる場合があります。Web サイトでは、パフォーマンス向上のためにキャッシングを使用する必要がありますが、最新データの要求は欠かせません。ASP.NET 1.x では、ページを一定期間キャッシュしておき、入力パラメータ (QUERYSTRING パラメータまたは POST パラメータ) によって構成することが可能でした。

<%@ outputcache duration="3600" varybyparam="ProdID" %> 

上記のコードでは、変数 ProdID (製品 ID) に基づいて、メモリ内にページを 1 時間キャッシュします。

データのキャッシングが問題となるのは、基となるデータがアプリケーションのどこかで更新された場合です。たとえば、製品 ID によって製品カタログ ページがキャッシュされている場合を考えてみましょう。この製品についての情報 (販売可能数量、価格など) が管理用のサイトで更新された場合、キャッシュ内に残っている古いデータが顧客に表示されることになります。ASP.NET 1.x では、キャッシュが期限切れになるまで待つか、または Response.RemoveOutputCacheItem を使用してキャッシュを強制的に期限切れにする必要があります。

ASP.NET 2.0 では、テーブル レベルの SQL 通知を実装することにより、データベースのキャッシュ依存関係に対するサポートが提供されます。テーブル レベルの依存関係によって、データの変更がページに通知されます。以下のコードは製品ページを 1 時間キャッシュしますが、データベース テーブルに対する依存関係が追加されています。

<%@ outputcache duration="3600" varybyparam="ProdID" 
sqldependency="MyDatabase:Products" %>

新しい SQLDependency 属性を使用することにより、キャッシュされたページは、Products テーブルが変更された場合に、期限切れになります。SQLDependency 属性は、web.config ファイルで設定された、Microsoft SQL Server の DataSource を参照する必要があります。DataSource はデータベース接続と必要なパラメータを識別し、依存関係の通知を行います。

SQL 依存関係のカスタマイズ

既定の SQLDependency クラスがサポートするのは Microsoft SQL Server のみですが、machine.config ファイルおよび web.config ファイルを使用すると、クラスの置き換えと再設定を行うことができます。この機能によって、カスタマイズした SQLDependency クラスを作成することで、Oracle や Sybase など他のデータベースの DataSource に対して同様の機能を提供できます。

データ ソース キャッシング

ASP.NET 2.0 でデータをキャッシュするためのもう 1 つ方法は、データ ソースのいくつかに直接組み込まれているキャッシュ メカニズムを利用することです。たとえば、SQLDataSource クラスおよび ObjectDataSource クラスではどちらでも、EnableCaching プロパティを使用した直接キャッシングがサポートされています。このプロパティを true に設定するだけで、データ ソースがデータ ストアから取得したデータを自動的にキャッシュするようになります。このキャッシュの有効期限は、CacheDuration プロパティに指定した時間、またはページ レベル ディレクティブに類似した SQLCacheDependency によって決定されます。データ ソース コントロールに組み込まれたこの機能のおかげで、コードを一切記述することなく、迅速かつ簡単にキャッシュを実装できます。

拡張 DataSet リモート処理のサポート

ASP.NET 1.1 に関する一般的な不満の 1 つとして、DataSet が常に XML にシリアル化されるために、他のシリアル化されたバイナリ表現と比較して、.NET リモート処理経由での DataSet の送信が遅いという点が挙げられます。ASP.NET 2.0 では、シリアル化されたバイナリ表現として DataSet が転送されます。これにより、転送される DataSet のサイズが小さくなるため、情報を渡すのに必要な転送時間が短縮されます。

セキュリティ

ASP.NET 2.0 では、構成ファイル内のほとんどすべてのセクションに対して暗号化を行うためのサービスが提供されます。暗号化を利用することにより、アプリケーション内に従来より安全に情報を格納できます。たとえば、Web.Config ファイルの ConnectionStrings セクションを暗号化することで、取り扱いに注意が必要なすべての情報を保護できます。構成情報の暗号化によって、接続文字列などの情報を安全に保存できます。

構成セクションの暗号化を行う場合は、Triple DES などの米国政府の標準の暗号化アルゴリズムを利用できます。暗号化されたデータは構成ファイルに格納されるため、アプリケーションがレジストリに依存することはありません。

まとめ

ASP.NET 2.0 の目的は、新しいデータ コントロールに機能をカプセル化することによって、データ処理についてさらなるコントロールと柔軟性をもたらし、データへのアクセスとその表示に必要なコード量を削減することにあります。新しいデータ アクセス モデルとコントロールを使用することにより、約 70% ものデータ アクセス コードを削減できます。従来の ASP または ASP.NET 1.1 のアプリケーションでは手作業で作成する必要があった機能の多くが、ASP.NET 2.0 の新しいデータ コントロールには組み込まれています。データ アクセスのための新しいアーキテクチャも非常に拡張性に富んでおり、データベース、XML ファイル、フラット ファイル、データ ストリームなど、さまざまなデータ ソースにアクセスできるようにデザインされています。エンタープライズ開発者は、この新しいアーキテクチャを利用することで、統一された単純なインターフェイスをフロント エンドで使用しつつ、あらゆるデータ ソースにバックエンドで接続できます。

参考書籍

執筆者紹介

Jayesh Patel—Jay Patel は、.NET および Java テクノロジの開発者です。パターン ベースのプログラミングと機敏なメソドロジを中心に研究を行っています。

Bryan Acker—Bryan Acker は Infusion Development のテクニカル ライターです。ASP および ASP.NET での Web 開発や Web ホスティングに関する強力なバックグラウンドを持っています。

Robert McGovern—Rob McGovern は Infusion Development のシニア ライターであり、開発者兼プロジェクト マネージャでもあります。『CodeNotes for ASP.NET』や『JSP to ASP.NET migration guide』などの著者であり、さまざまな ASP.NET プロジェクトに携わった経験があります。

Infusion Development Corporation は、Fortune 1000 の企業を対象に、特に金融サービス業の分野で、カスタマイズ ソフトウェアの開発、トレーニング、およびコンサルティング サービスを提供するマイクロソフト公認のソリューション プロバイダです。ニューヨークとトロントに事業所があり、金融サービス、セキュリティ ブローカー、およびソフトウェア開発業における世界最大級の企業を含む国際的な顧客ベースを獲得しています。Infusion Development  の従業員は、CodeNotes ブック シリーズの執筆、作成にも携わっています。