SqlDataSource コントロールでデータにクエリを実行する (C#)
前のチュートリアルでは、ObjectDataSource コントロールを使用して、プレゼンテーション層とデータ アクセス層を完全に分離しました。 このチュートリアルからは、プレゼンテーションとデータ アクセスを厳密に分離する必要のない単純なアプリケーションに SqlDataSource コントロールを使用する方法について説明します。
はじめに
これまでに確認したすべてのチュートリアルでは、プレゼンテーション層、ビジネス ロジック層、データ アクセス層で構成される階層化アーキテクチャを使用してきました。 データ アクセス層 (DAL) は、最初のチュートリアル (「データ アクセス層を作成する」) と 2 番目のチュートリアル (「ビジネス ロジック層を作成する」) のビジネス ロジック層で作成されました。 「ObjectDataSource でデータを表示する」のチュートリアル以降、ASP.NET 2.0 の新しい ObjectDataSource コントロールを使用して、プレゼンテーション層からアーキテクチャと宣言的にやりとりする方法について見てきました。
これまでのチュートリアルはすべてアーキテクチャを使用してデータを操作してきましたが、アーキテクチャをバイパスして、ASP.NET ページから直接データベース データにアクセス、挿入、更新、削除することもできます。 これにより、特定のデータベース クエリやビジネス ロジックが Web ページに直接配置されます。 大規模なアプリケーションや複雑なアプリケーションの場合、階層化されたアーキテクチャの設計、実装、使用は、アプリケーションの成功、更新可能性、保守性にとって非常に重要です。 ただし、非常に単純な 1 回限りのアプリケーションを作成する場合は、堅牢なアーキテクチャを開発する必要はありません。
ASP.NET 2.0 には、SqlDataSource、AccessDataSource、ObjectDataSource、XmlDataSource、SiteMapDataSource の 5 つの組み込みデータ ソース コントロールが用意されています。 SqlDataSource を使用すると、Microsoft SQL Server、Microsoft Access、Oracle、MySQL などのリレーショナル データベースから直接データにアクセスして変更できます。 これとそれ以降の 3 つのチュートリアルでは、SqlDataSource コントロールを操作する方法、データベース データを照会し、フィルター処理する方法、SqlDataSource を使用してデータを挿入、更新、削除する方法について説明します。
図 1: ASP.NET 2.0 には 5 つの組み込みデータ ソース コントロールが含まれています
ObjectDataSource と SqlDataSource の比較
概念的には、ObjectDataSource コントロールと SqlDataSource コントロールはどちらも単にデータへのプロキシです。 「ObjectDataSource でデータを表示する」のチュートリアルで説明したように、ObjectDataSource には、データを提供するオブジェクトの種類を示すプロパティと、基になるオブジェクトの種類からデータを選択、挿入、更新、削除するために呼び出すメソッドがあります。 ObjectDataSource のプロパティが構成されたら、基になるアーキテクチャと対話する ObjectDataSource の Select()
、Insert()
、Delete()
、Update()
メソッドを使用して、GridView、DetailsView、DataList などのデータ Web コントロールをコントロールにバインドできます。
SqlDataSource も同じ機能を提供しますが、オブジェクト ライブラリではなくリレーショナル データベースに対して動作します。 SqlDataSource の場合、データの挿入、更新、削除、取得の実行には、データベース接続文字列と、アドホック SQL クエリまたはストアド プロシージャを指定する必要があります。 SqlDataSource の Select()
、Insert()
、Update()
、Delete()
メソッドは、呼び出されると、指定されたデータベースに接続し、適切な SQL クエリを発行します。 次の図に示すように、これらのメソッドはデータベースに接続し、クエリを発行して結果を返すという厄介な作業を行います。
図 2: SqlDataSource はデータベースへのプロキシとして機能する
Note
このチュートリアルでは、データベースからデータを取得することに重点を置きます。 「SqlDataSource コントロールでデータを挿入、更新、削除する」のチュートリアルでは、挿入、更新、削除をサポートするように SqlDataSource を構成する方法について説明します。
SqlDataSource コントロールと AccessDataSource コントロール
SqlDataSource コントロールに加えて、ASP.NET 2.0 には AccessDataSource コントロールも含まれています。 これらの 2 つの異なるコントロールがあることで、ASP.NET 2.0 を初めて使用する多くの開発者は、AccessDataSource コントロールが Microsoft Access 専用に設計されており、SqlDataSource コントロールが Microsoft SQL Server 専用に設計されていると推測します。 AccessDataSource は Microsoft Access で動作するように設計されていますが、SqlDataSource コントロールは、.NET 経由でアクセスできる、どのリレーショナル データベースでも動作します。 これには、Microsoft SQL Server、Microsoft Access、Oracle、Informix、MySQL、PostgreSQL など、OleDb または ODBC に準拠したデータ ストアが含まれます。
AccessDataSource コントロールと SqlDataSource コントロールの唯一の違いは、データベース接続情報の指定方法です。 AccessDataSource コントロールに必要なのは、Access データベース ファイルへのファイル パスのみです。 一方、SqlDataSource には完全な接続文字列が必要です。
手順 1: SqlDataSource Web ページを作成する
SqlDataSource コントロールを使用してデータベース データを直接操作する方法を調べる前に、まず、これとそれ以降の 3 つのチュートリアルに必要な ASP.NET ページを Web サイト プロジェクトに作成してみましょう。 まず、SqlDataSource
という名前の新しいフォルダーを追加します。 次に、次の ASP.NET ページをそのフォルダーに追加し、各ページを Site.master
マスター ページに関連付けます。
Default.aspx
Querying.aspx
ParameterizedQueries.aspx
InsertUpdateDelete.aspx
OptimisticConcurrency.aspx
図 3: SqlDataSource 関連のチュートリアルの ASP.NET ページを追加する
他のフォルダーと同様に、SqlDataSource
フォルダーの Default.aspx
のセクションにチュートリアルが一覧表示されます。 SectionLevelTutorialListing.ascx
ユーザー コントロールではこの機能が提供されていることを思い出してください。 そのため、このユーザー コントロールをソリューション エクスプローラーからページのデザイン ビューにドラッグして Default.aspx
に追加します。
図 4: SectionLevelTutorialListing.ascx
ユーザー コントロールを Default.aspx
に追加する (クリックするとフルサイズの画像が表示されます)
最後に、これら 4 つのページをエントリとして Web.sitemap
ファイルに追加します。 具体的には、カスタム ボタンの追加の後に、DataList と Repeater <siteMapNode>
に次のマークアップを追加します。
<siteMapNode url="~/SqlDataSource/Default.aspx"
title="Using the SqlDataSource Control"
description="Work directly with database data using the SqlDataSource control.">
<siteMapNode url="~/SqlDataSource/Querying.aspx" title="Retrieving Database Data"
description="Examines how to query data from a database that can then be
displayed through a data Web control."/>
<siteMapNode url="~/SqlDataSource/ParameterizedQueries.aspx"
title="Parameterized Queries"
description="Learn how to specify parameterized WHERE clauses in the
SqlDataSource's SELECT statement." />
<siteMapNode url="~/SqlDataSource/InsertUpdateDelete.aspx"
title="Inserting, Updating, and Deleting Database Data"
description="See how to configure the SqlDataSource to include INSERT, UPDATE,
and DELETE statements." />
<siteMapNode url="~/SqlDataSource/OptimisticConcurrency.aspx"
title="Using Optimistic Concurrency"
description="Explore how to augment the SqlDataSource to include support for
optimistic concurrency." />
</siteMapNode>
Web.sitemap
を更新した後、ブラウザーでチュートリアル Web サイトの表示を確認してみましょう。 左側のメニューに、チュートリアルの編集、挿入、削除の項目が含まれるようになりました。
図 5: SqlDataSource チュートリアル用のエントリが含まれたサイト マップ
手順 2: SqlDataSource コントロールを追加、構成する
まず、SqlDataSource
フォルダー内の Querying.aspx
ページを開き、デザイン ビューに切り替えます。 ツールボックスからデザイナーに SqlDataSource コントロールをドラッグし、ID
を ProductsDataSource
に設定します。 ObjectDataSource と同様に、SqlDataSource はレンダリングされた出力を生成しないため、デザイン サーフェイスに灰色のボックスとして表示されます。 SqlDataSource を構成するには、SqlDataSource のスマート タグから [データ ソースの構成] リンクをクリックします。
図 6: SqlDataSource のスマート タグから [データ ソースの構成] リンクをクリックする
これにより、SqlDataSource コントロールのデータ ソースの構成ウィザードが表示されます。 ウィザードの手順は ObjectDataSource コントロールとは異なりますが、最終的な目標は同じで、データ ソースを使用してデータを取得、挿入、更新、削除する方法の詳細を提供することです。 SqlDataSource の場合、使用する基になるデータベースを指定し、アドホック SQL ステートメントまたはストアド プロシージャを指定する必要があります。
ウィザードの最初の手順では、データベースの入力を求められます。 ドロップダウン リストには、Web アプリケーションの App_Data
フォルダーにあるデータベースと、サーバー エクスプローラーの [データ接続] ノードに追加されたデータベースが含まれます。 App_Data
フォルダー内の NORTHWIND.MDF
データベースの接続文字列がプロジェクトの Web.config
ファイルに既に追加されているため、ドロップダウン リストにはその接続文字列への参照 (NORTHWINDConnectionString
) が含まれています。 ドロップダウン リストからこの項目を選択し、[次へ] をクリックします。
図 7: ドロップダウン リストから NORTHWINDConnectionString
を選択する
データベースを選択すると、データを返すクエリが求められます。 返すテーブルまたはビューの列を指定するか、カスタム SQL ステートメントを入力するか、ストアド プロシージャを指定できます。 この選択は、[カスタム SQL ステートメントまたはストアド プロシージャを指定する] と [テーブルまたはビューから列を指定します] ラジオ ボタンを使用して切り替えることができます。
Note
この最初の例では、[テーブルまたはビューから列を指定します] オプションを使用します。 このチュートリアルの後半でウィザードに戻り、[カスタム SQL ステートメントまたはストアド プロシージャを指定する] オプションについて説明します。
図 8 は、[テーブルまたはビューから列を指定します] ラジオ ボタンが選択されている場合の [Select ステートメントの構成] 画面を示しています。 ドロップダウン リストには、Northwind データベース内のテーブルとビューのセットが含まれており、選択したテーブルまたはビューの列が下のチェックボックス リストに表示されています。 この例で、Products
テーブルから ProductID
、ProductName
、UnitPrice
列を返してみましょう。 図 8 に示すように、これらの選択を行った後、ウィザードには、結果の SQL ステートメント SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]
が表示されます。
図 8: Products
テーブルからデータを返す
Products
テーブルから ProductID
、ProductName
、UnitPrice
列を返すようにウィザードを構成したら、[次へ] ボタンをクリックします。 この最後の画面では、前の手順で構成したクエリの結果を確認できます。 [クエリのテスト] ボタンをクリックすると、構成された SELECT
ステートメントが実行され、結果がグリッドに表示されます。
図 9: [クエリのテスト] ボタンをクリックして SELECT
クエリを確認する
ウィザードを完了するには、 [完了]をクリックします。
ObjectDataSource と同様に、SqlDataSource のウィザードでは、単にコントロールのプロパティ (つまり、ConnectionString
と SelectCommand
プロパティ) に値が割り当てられます。 ウィザードを完了すると、SqlDataSource コントロールの宣言型マークアップは次のようになります。
<asp:SqlDataSource ID="ProductsDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand="SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]">
</asp:SqlDataSource>
ConnectionString
プロパティは、データベースに接続する方法に関する情報を提供します。 このプロパティについては、完全でハードコーディングされた接続文字列値を割り当てたり、Web.config
で接続文字列を指すことができます。 Web.config で接続文字列値を参照するには、構文 <%$ expressionPrefix:expressionValue %>
を使用します。 通常、 expressionPrefix は ConnectionStrings で、 expressionValue は Web.config
<connectionStrings>
セクションの接続文字列の名前です。 ただし、構文を使用して、リソース ファイルから <appSettings>
要素またはコンテンツを参照できます。 この構文の詳細については、「ASP.NET 式の概要」を参照してください。
SelectCommand
プロパティは、データを返すアドホック SQL ステートメントまたはストアド プロシージャを指定します。
手順 3: データ Web コントロールを追加して SqlDataSource にバインドする
SqlDataSource を構成したら、GridView や DetailsView などのデータ Web コントロールにバインドできます。 このチュートリアルでは、GridView にデータを表示します。 ツールボックスから GridView をページにドラッグし、GridView のスマート タグのドロップダウン リストからデータ ソースを選択して ProductsDataSource
SqlDataSource にバインドします。
図 10: GridView を追加して、SqlDataSource コントロールにバインドする (クリックするとフルサイズの画像が表示されます)
GridView のスマート タグのドロップダウン リストから SqlDataSource コントロールを選択すると、Visual Studio は、データ ソース コントロールから返された各列の BoundField または CheckBoxField を自動的に GridView に追加します。 SqlDataSource は 3 つのデータベース列 (ProductID
、ProductName
、UnitPrice
) を返すので、GridView には 3 つのフィールドがあります。
少し時間を取って GridView の 3 つの BoundFields を構成してみましょう。 ProductName
フィールドの HeaderText
プロパティを "Product Name" に、UnitPrice
フィールドを "Price" に変更します。 また、UnitPrice
フィールドを通貨として書式設定します。 これらの変更を行った後、GridView の宣言型マークアップは次のようになります。
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="ProductsDataSource"
EnableViewState="False">
<Columns>
<asp:BoundField DataField="ProductID" HeaderText="ProductID"
InsertVisible="False" ReadOnly="True" SortExpression="ProductID" />
<asp:BoundField DataField="ProductName" HeaderText="Product Name"
SortExpression="ProductName" />
<asp:BoundField DataField="UnitPrice" HeaderText="Price"
SortExpression="UnitPrice" DataFormatString="{0:c}"
HtmlEncode="False" />
</Columns>
</asp:GridView>
ブラウザーでこのページにアクセスします。 図 11 に示すように、GridView には各製品の ProductID
、ProductName
、UnitPrice
値が一覧表示されます。
図 11: GridView が各製品の ProductID
、ProductName
、UnitPrice
の値を表示する (クリックするとフルサイズの画像が表示されます)
ページにアクセスすると、GridView はデータ ソース コントロールの Select()
メソッドを呼び出します。 ObjectDataSource コントロールを使用した際、これは ProductsBLL
クラスの GetProducts()
メソッドを呼び出しました。 しかし、SqlDataSource では、Select()
メソッドは指定されたデータベースへの接続を確立し、SelectCommand
(この例では SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]
) を発行します。 SqlDataSource は、GridView が列挙した結果を返し、返された各データベース レコードについて GridView に行を作成します。
組み込みのデータ Web コントロール機能と SqlDataSource コントロール
一般に、データ Web コントロールのページング、並べ替え、編集、削除、挿入などに固有の機能は、データ Web コントロールに対して固有であり、使用されるデータ ソース コントロールには依存しません。 つまり、GridView は、組み込みのページング、並べ替え、編集、削除を使用して、ObjectDataSource と SqlDataSource のどちらにバインドされているかを確認できます。 ただし、特定のデータ Web コントロール機能は、使用されているデータ ソース コントロールやデータ ソース コントロールの構成に依存します。
たとえば、「大量のデータを効率的にページングする」のチュートリアルでは、データ Web コントロールのページング ロジックが、既定ではどのように基になるデータ ソースからのすべてのレコードをネイティブに返し、レコードの適切なサブセットのみを表示するか (現在のページ インデックスと、1 ページあたりに表示するレコード数に基づく) について説明しました。 大量の結果セットをページングする場合、このモデルは非常に非効率的です。 幸い、ObjectDataSource は、表示するレコードの正確なサブセットのみを返すカスタム ページングをサポートするように構成できます。 ただし、SqlDataSource コントロールには、カスタム ページングを実装するためのプロパティがありません。
SqlDataSource には、ページングと並べ替えについての別の微妙な問題があります。 既定では、SqlDataSource から返されるデータは、GridView を通じてページングまたは並べ替えることができます。 これを示すために、Querying.aspx
にある GridView のスマート タグで [ページングを有効にする] と [並べ替えを有効にする] オプションをオンにし、これが期待どおりに動作することを確認します。
SqlDataSource がデータベース データを緩やかに型指定された DataSet に取得するため、並べ替えとページングは機能します。 ページングの実装に不可欠な側面であるクエリから返されるレコードの合計数は、DataSet から確認できます。 さらに、DataSet の結果は DataView で並べ替えることができます。 これらの機能は、GridView がページングまたは並べ替えられたデータを要求するときに、SqlDataSource によって自動的に使用されます。
SqlDataSource は、そのDataSourceMode
プロパティを DataSet
(既定値) から DataReader
に変更することで、DataSet ではなく DataReader を返すように構成できます。 DataReader を必要とする既存のコードに SqlDataSource の結果を渡す場合は、DataReader を使用することをお勧めします。 さらに、DataReader は DataSet よりもかなり単純なオブジェクトであるため、パフォーマンスが向上します。 ただし、この変更を行うと、SqlDataSource はクエリによって返されるレコードの数を確認できないため、データ Web コントロールは並べ替えもページもできません。また、返されたデータを並べ替える手法も DataReader では提供されません。
手順 4: カスタム SQL ステートメントまたはストアド プロシージャを使用する
SqlDataSource コントロールを構成する場合、データを返すために使用するクエリは、2 つの方法、つまり、カスタム SQL ステートメントかストアド プロシージャ、または既存のテーブルまたはビューの列として指定できます。 手順 2 では、Products
テーブルから列を選択する方法を確認しました。 カスタム SQL ステートメントを使用する方法を見てみましょう。
別の GridView コントロールを Querying.aspx
ページに追加し、スマート タグのドロップダウン リストから新しいデータ ソースを作成することを選択します。 次に、データがデータベースからプルされることを示します。これにより、新しい SqlDataSource コントロールが作成されます。 コントロールに ProductsWithCategoryInfoDataSource
という名前を付けます。
図 12: ProductsWithCategoryInfoDataSource
という名前の新しい SqlDataSource コントロールを作成する
次の画面では、データベースの指定を求められます。 図 7 で説明したように、ドロップダウン リストから NORTHWINDConnectionString
を選択し、[次へ] をクリックします。 [Select ステートメントの構成] 画面で、[カスタム SQL ステートメントまたはストアド プロシージャを指定する] ラジオ ボタンを選択し、[次へ] をクリックします。 これにより、[カスタム ステートメントまたはストアド プロシージャの定義] 画面が表示され、SELECT、UPDATE、INSERT、DELETE というラベルのタブが表示されます。 各タブでは、テキスト ボックスにカスタム SQL ステートメントを入力するか、ドロップダウン リストからストアド プロシージャを選択できます。 このチュートリアルではカスタム SQL ステートメントの入力について説明します。次のチュートリアルでは、ストアド プロシージャを使用する例を示します。
図 13: カスタム SQL ステートメントを入力するか、ストアド プロシージャを選択する
カスタム SQL ステートメントは、テキスト ボックスに手動で入力することも、[クエリ ビルダー] ボタンをクリックしてグラフィカルに作成することもできます。 クエリ ビルダーまたはテキスト ボックスで、次のクエリを使用し、製品の CategoryName
を Categories
テーブルから取得する JOIN
を使用して Products
テーブルから ProductID
フィールドと ProductName
フィールドを返します。
SELECT Products.ProductID, Products.ProductName, Categories.CategoryName
FROM Categories
INNER JOIN Products ON
Categories.CategoryID = Products.CategoryID
図 14: クエリ ビルダーを使用してクエリをグラフィカルに作成する
クエリを指定したら、[次へ] をクリックして [クエリのテスト] 画面に進みます。 [完了] をクリックして、SqlDataSource ウィザードを完了します。
ウィザードが完了すると、GridView に 3 つの BoundFields が追加されて、クエリから返された ProductID
、ProductName
、CategoryName
列が表示され、次のような宣言型マークアップが表示されます。
<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="ProductsWithCategoryInfoDataSource"
EnableViewState="False">
<Columns>
<asp:BoundField DataField="ProductID" HeaderText="ProductID"
InsertVisible="False" ReadOnly="True" SortExpression="ProductID" />
<asp:BoundField DataField="ProductName" HeaderText="ProductName"
SortExpression="ProductName" />
<asp:BoundField DataField="CategoryName" HeaderText="CategoryName"
SortExpression="CategoryName" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="ProductsWithCategoryInfoDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand="
SELECT Products.ProductID, Products.ProductName, Categories.CategoryName
FROM Categories
INNER JOIN Products ON Categories.CategoryID = Products.CategoryID">
</asp:SqlDataSource>
図 15: GridView が各製品の ID、名前、関連付けられているカテゴリ名を表示する (クリックするとフルサイズの画像が表示されます)
まとめ
このチュートリアルでは、SqlDataSource コントロールを使用してデータのクエリと表示を行う方法について説明しました。 ObjectDataSource と同様に、SqlDataSource はプロキシとして機能し、データにアクセスするための宣言型アプローチを提供します。 そのプロパティは、接続先のデータベースと、実行する SQL SELECT
クエリを指定します。これらのプロパティは、プロパティ ウィンドウまたは DataSource の構成ウィザードを使用して指定できます。
このチュートリアルで調べた SELECT
クエリの例では、指定したクエリからすべてのレコードが返されました。 ただし、SqlDataSource コントロールには、プログラムによって値が割り当てられるか、指定したソースから自動的にプルされるパラメーターを含む WHERE
句を含めることができます。 次のチュートリアルでは、パラメーター化されたクエリを作成して使用する方法について説明します。
プログラミングに満足!
もっと読む
この記事で説明したトピックの詳細については、次のリソースを参照してください。
- SqlDataSource コントロールの概要
- ASP.NET クイック スタート チュートリアル: SqlDataSource コントロール
- Web.config
<connectionStrings>
要素 - データベース接続文字列リファレンス
著者について
7 冊の ASP/ASP.NET 書籍の著者であり、4GuysFromRolla.com の創設者である Scott Mitchell は、1998 年から Microsoft Web テクノロジに取り組んでいます。 Scott は、独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズは24時間で2.0 ASP.NET 自分自身を教えています。 にアクセスするか、ブログを使用して にアクセスmitchell@4GuysFromRolla.comできます。これは でhttp://ScottOnWriting.NET見つけることができます。
特別な感謝
このチュートリアル シリーズは、多くの役に立つ校閲者によってレビューされました。 このチュートリアルのリード レビュー担当者は、Susan Connery、Bernadette Leigh、David Suru です。 今後の MSDN の記事を確認することに関心がありますか? その場合は、 にmitchell@4GuysFromRolla.com行をドロップしてください。