SqlDataSource コントロールでデータにクエリを実行する (C#)

作成者: Scott Mitchell

PDF のダウンロード

前のチュートリアルでは、ObjectDataSource コントロールを使用して、プレゼンテーション レイヤーをデータ アクセス レイヤーから完全に分離しました。 このチュートリアル以降では、プレゼンテーションとデータ アクセスを厳密に分離する必要のない単純なアプリケーションに SqlDataSource コントロールを使用する方法について説明します。

はじめに

これまでに確認したすべてのチュートリアルでは、プレゼンテーション、ビジネス ロジック、およびデータ アクセスレイヤーで構成される階層化アーキテクチャを使用してきました。 データ アクセス層 (DAL) は、最初のチュートリアル (データ アクセス層の作成) と 2 番目の (ビジネス ロジック層の作成) のビジネス ロジック層で作成されました。 ObjectDataSource を使用したデータの表示に関するチュートリアルから、ASP.NET 2.0 の新しい ObjectDataSource コントロールを使用して、プレゼンテーション レイヤーからアーキテクチャと宣言的にインターフェイスする方法について説明しました。

これまでのチュートリアルでは、アーキテクチャを使用してデータを操作してきましたが、アーキテクチャをバイパスして、ASP.NET ページから直接データベース データにアクセス、挿入、更新、削除することもできます。 これにより、特定のデータベース クエリとビジネス ロジックが Web ページに直接配置されます。 十分に大規模または複雑なアプリケーションの場合、階層化されたアーキテクチャの設計、実装、および使用は、アプリケーションの成功、更新可能性、保守性にとって非常に重要です。 ただし、非常に単純な 1 回限りのアプリケーションを作成する場合は、堅牢なアーキテクチャを開発する必要はありません。

ASP.NET 2.0 には、SqlDataSource、AccessDataSourceObjectDataSourceXmlDataSourceSiteMapDataSource の 5 つの組み込みデータ ソース コントロールが用意されています。 SqlDataSource を使用すると、Microsoft SQL Server、Microsoft Access、Oracle、MySQL などのリレーショナル データベースから直接データにアクセスして変更できます。 このチュートリアルと次の 3 つのチュートリアルでは、SqlDataSource コントロールを操作する方法、データベース データのクエリとフィルター処理の方法、および SqlDataSource を使用してデータを挿入、更新、削除する方法について説明します。

ASP.NET 2.0 には 5 つの Built-In データ ソース管理が含まれています

図 1: ASP.NET 2.0 には 5 つの Built-In データ ソースコントロールが含まれています

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 クエリを発行します。 次の図に示すように、これらのメソッドは、データベースへの接続、クエリの発行、結果の返しを行うという不機嫌な作業を行います。

SqlDataSource は、データベースへのプロキシとして機能します

図 2: SqlDataSource がデータベースのプロキシとして機能する

注意

このチュートリアルでは、データベースからデータを取得することに重点を置きます。 SqlDataSource コントロールを使用したデータの挿入、更新、および削除のチュートリアルでは、挿入、更新、削除をサポートするように SqlDataSource を構成する方法について説明します。

SqlDataSource コントロールと AccessDataSource コントロール

SqlDataSource コントロールに加えて、ASP.NET 2.0 には AccessDataSource コントロールも含まれています。 これら 2 つの異なるコントロールにより、ASP.NET 2.0 を初めて使用する多くの開発者は、AccessDataSource コントロールが Microsoft SQL Serverでのみ動作するように設計された SqlDataSource コントロールを使用して Microsoft Access と排他的に連携するように設計されていることを疑います。 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

SqlDataSource-Related チュートリアルの ASP.NET ページを追加する

図 3: SqlDataSource-Related チュートリアルの ASP.NET ページを追加する

他のフォルダーと同様に、 Default.aspx フォルダーの SqlDataSource セクションにチュートリアルが一覧表示されます。 ユーザー コントロールには SectionLevelTutorialListing.ascx この機能があることを思い出してください。 したがって、このユーザー コントロールを に追加するには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 サイトを表示します。 左側のメニューに、チュートリアルの編集、挿入、削除の項目が含まれるようになりました。

サイト マップに SqlDataSource チュートリアルのエントリが含まれるようになりました

図 5: サイト マップに SqlDataSource チュートリアルのエントリが含まれるようになりました

手順 2: SqlDataSource コントロールの追加と構成

まず、フォルダー内のページをQuerying.aspxSqlDataSource開き、デザイン ビューに切り替えます。 SqlDataSource コントロールをツールボックスからDesignerにドラッグし、その コントロールを ID に設定しますProductsDataSource。 ObjectDataSource と同様に、SqlDataSource はレンダリングされた出力を生成しないため、デザインサーフェイスに灰色のボックスとして表示されます。 SqlDataSource を構成するには、SqlDataSource のスマート タグから [データ ソースの構成] リンクをクリックします。

SqlDataSource のスマート タグから [データの構成] Source Linkをクリックします

図 6: SqlDataSource のスマート タグから [データの構成] Source Linkをクリックする

これにより、SqlDataSource コントロールのデータ ソースの構成ウィザードが表示されます。 ウィザードの手順は ObjectDataSource コントロールとは異なりますが、最終的な目標は、データ ソースを使用してデータを取得、挿入、更新、削除する方法の詳細を提供することです。 SqlDataSource の場合、使用する基になるデータベースを指定し、アドホック SQL ステートメントまたはストアド プロシージャを指定する必要があります。

ウィザードの最初の手順では、データベースの入力を求められます。 ドロップダウン リストには、Web アプリケーションのフォルダーにあるデータベースと、サーバー エクスプローラーの App_Data [データ Connections] ノードに追加されたデータベースが含まれます。 フォルダー内のデータベースの接続文字列NORTHWIND.MDFがプロジェクトのWeb.configファイルに既に追加されているため、ドロップダウン リストには、その接続文字列 NORTHWINDConnectionStringへの参照が含App_Dataまれています。 ドロップダウン リストからこの項目を選択し、[次へ] をクリックします。

Drop-Down リストから NORTHWINDConnectionString を選択します

図 7: Drop-Down リストから を選択 NORTHWINDConnectionString する

データベースを選択すると、データを返すクエリが求められます。 返すテーブルまたはビューの列を指定するか、カスタム SQL ステートメントを入力するか、ストアド プロシージャを指定できます。 [カスタム SQL ステートメントまたはストアド プロシージャを指定する] および [テーブルまたはビューの列を指定する] ラジオ ボタンを使用して、この選択を切り替えることができます。

注意

この最初の例では、 [テーブルまたはビューから列を指定する] オプションを使用します。 このチュートリアルの後半でウィザードに戻り、[カスタム SQL ステートメントまたはストアド プロシージャの指定] オプションについて説明します。

図 8 は、[テーブルまたはビューから列を指定する] ラジオ ボタンが選択されている場合の [ステートメントの選択の構成] 画面を示しています。 ドロップダウン リストには、Northwind データベースのテーブルとビューのセットが含まれており、選択したテーブルまたはビューの列が下のチェックボックス リストに表示されます。 この例では、テーブルから 、、ProductIDおよび UnitPrice の各列をProducts返します。 ProductName 図 8 に示すように、これらの選択を行った後、ウィザードには結果の SQL ステートメント SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]が表示されます。

Products テーブルからデータを返す

図 8: テーブルからデータを Products 返す

テーブルから ProductsProductName、および UnitPrice の各列をProductID返すようにウィザードを構成したら、[次へ] ボタンをクリックします。 この最後の画面では、前の手順で構成したクエリの結果を確認できます。 [クエリのテスト] ボタンをクリックすると、構成された SELECT ステートメントが実行され、結果がグリッドに表示されます。

[クエリのテスト] ボタンをクリックして SELECT クエリを確認する

図 9: [クエリのテスト] ボタンをクリックしてクエリを SELECT 確認する

ウィザードを完了するには、[完了] をクリックします。

ObjectDataSource と同様に、SqlDataSource ウィザードでは、コントロールのプロパティ (つまり、 プロパティと SelectCommand プロパティ) に値をConnectionString割り当てるだけです。 ウィザードが完了すると、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 にバインドします。

GridView を追加して SqlDataSource コントロールにバインドする

図 10: GridView を追加して SqlDataSource コントロールにバインドする (フルサイズの画像を表示する をクリックします)

GridView のスマート タグのドロップダウン リストから SqlDataSource コントロールを選択すると、Visual Studio によって、データ ソース コントロールによって返される各列の BoundField または CheckBoxField が GridView に自動的に追加されます。 SqlDataSource は 3 つのデータベース列 ProductIDProductName返し、 UnitPrice GridView には 3 つのフィールドがあるためです。

少し時間を取って、GridView の 3 つの BoundFields を構成します。 フィールドのHeaderTextプロパティを ProductName [製品名] に、UnitPriceフィールドを [価格] に変更します。 また、フィールドを 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 には各製品の 、、ProductNameおよび UnitPrice の値がProductID一覧表示されます。

GridView には、各製品の ProductID、ProductName、および UnitPrice 値が表示されます

図 11: GridView には、各製品の ProductID、、 ProductNameおよび UnitPrice の値が表示されます (フルサイズの画像を表示する をクリックします)。

ページにアクセスすると、GridView はデータ ソース コントロールの メソッドを Select() 呼び出します。 ObjectDataSource コントロールを使用していた場合、これは クラス s GetProducts() メソッドとProductsBLL呼ばれます。 ただし、SqlDataSource では、 メソッドによってSelect()指定されたデータベースへの接続が確立され、 (SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]この例では) がSelectCommand発行されます。 SqlDataSource は、GridView が列挙した結果を返し、返される各データベース レコードの GridView に行を作成します。

Built-In データ Web コントロール機能と SqlDataSource コントロール

一般に、データ Web コントロールに固有の機能は、ページング、並べ替え、編集、削除、挿入など、データ Web コントロールに固有であり、使用されるデータ ソース コントロールには依存しません。 つまり、GridView では、組み込みのページング、並べ替え、編集、および削除を使用して、ObjectDataSource または SqlDataSource にバインドすることができます。 ただし、特定のデータ Web コントロール機能は、使用されているデータ ソース 管理やデータ ソース コントロールの構成に影響を受けます。

たとえば、 大量のデータを効率的にページングする チュートリアルでは、既定では、データ Web コントロールのページング ロジックが基になるデータ ソース からすべての レコードを単純に返し、現在のページ インデックスとページごとに表示するレコードの数を指定したレコードの適切なサブセットのみを表示する方法について説明しました。 このモデルは、十分に大きな結果セットをページングする場合に非常に非効率的です。 幸いにも、ObjectDataSource は、表示するレコードの正確なサブセットのみを返すカスタム ページングをサポートするように構成できます。 ただし、SqlDataSource コントロールには、カスタム ページングを実装するためのプロパティがありません。

ページングと並べ替えのもう 1 つの微妙な機能は、SqlDataSource で発生します。 既定では、SqlDataSource から返されるデータは、GridView でページングまたは並べ替えることができます。 これを示すために、GridView のスマート タグQuerying.aspxの [ページングを有効にする] オプションと [並べ替えを有効にする] オプションをチェックし、これが期待どおりに動作することを確認します。

SqlDataSource はデータベース データを緩やかに型指定された DataSet に取得するため、並べ替えとページングが機能します。 ページングの実装に不可欠な側面であるクエリによって返されるレコードの合計数は、DataSet から確認できます。 さらに、DataSet の結果は DataView で並べ替えることができます。 これらの機能は、GridView がページングまたは並べ替えられたデータを要求するときに、SqlDataSource によって自動的に使用されます。

SqlDataSource は、そのプロパティを (既定値) DataReaderから DataSet に変更DataSourceModeすることで、DataSet ではなく DataReader を返すように構成できます。 DataReader を必要とする既存のコードに SqlDataSource の結果を渡す場合は、DataReader を使用することをお勧めします。 さらに、DataReader は DataSet よりもオブジェクトが大幅に単純であるため、パフォーマンスが向上します。 ただし、この変更を行った場合、SqlDataSource はクエリによって返されるレコードの数を確認できないため、データ Web コントロールは並べ替えもページもできません。また、返されたデータを並べ替える手法も DataReader によって提供されることはありません。

手順 4: カスタム SQL ステートメントまたはストアド プロシージャを使用する

SqlDataSource コントロールを構成する場合、データを返すために使用されるクエリは、カスタム SQL ステートメントまたはストアド プロシージャとして、または既存のテーブルまたはビューの列として、2 つの方法のいずれかで指定できます。 手順 2 では、テーブルから Products 列を選択することを確認しました。 カスタム SQL ステートメントの使用を見てみましょう。

ページに別の GridView コントロールを Querying.aspx 追加し、スマート タグのドロップダウン リストから新しいデータ ソースを作成することを選択します。 次に、データがデータベースからプルされることを示します。これにより、新しい SqlDataSource コントロールが作成されます。 コントロール ProductsWithCategoryInfoDataSourceに という名前を付けます。

ProductsWithCategoryInfoDataSource という名前の新しい SqlDataSource コントロールを作成する

図 12: という名前の新しい SqlDataSource コントロールを作成する ProductsWithCategoryInfoDataSource

次の画面では、データベースの指定を求められます。 図 7 に戻ったとおり、ドロップダウン リストから を NORTHWINDConnectionString 選択し、[次へ] をクリックします。 [ステートメントの選択の構成] 画面で、[カスタム SQL ステートメントまたはストアド プロシージャの指定] ラジオ ボタンを選択し、[次へ] をクリックします。 これにより、[カスタム ステートメントまたはストアド プロシージャの定義] 画面が表示され、SELECT、UPDATE、INSERT、DELETE というラベルのタブが表示されます。 各タブでは、テキスト ボックスにカスタム SQL ステートメントを入力するか、ドロップダウン リストからストアド プロシージャを選択できます。 このチュートリアルでは、カスタム SQL ステートメントの入力について説明します。次のチュートリアルには、ストアド プロシージャを使用する例が含まれています。

カスタム SQL ステートメントを入力するか、ストアド プロシージャを選択します

図 13: カスタム SQL ステートメントを入力するか、ストアド プロシージャを選択する

カスタム SQL ステートメントは、テキスト ボックスに手動で入力することも、[クエリ ビルダー] ボタンをクリックしてグラフィカルに作成することもできます。 クエリ ビルダーまたはテキスト ボックスから、次のクエリを使用して、 を使用してテーブルから フィールドと ProductName フィールドを返ProductIDし、 を使用してJOINテーブルからCategories製品をCategoryName取得します。Products

SELECT Products.ProductID, Products.ProductName, Categories.CategoryName
FROM Categories
    INNER JOIN Products ON
        Categories.CategoryID = Products.CategoryID

クエリ ビルダーを使用してクエリをグラフィカルに構築できます

図 14: クエリ ビルダーを使用してクエリをグラフィカルに構築する

クエリを指定したら、[次へ] をクリックして [クエリのテスト] 画面に進みます。 [完了] をクリックして、SqlDataSource ウィザードを完了します。

ウィザードが完了すると、GridView に 3 つの BoundField が追加され、クエリから返された 、ProductName、および CategoryName 列が表示され、次の宣言型マークアップが生成ProductIDされます。

<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>

GridView には、各製品の ID、名前、および関連するカテゴリ名が表示されます

図 15: GridView には、各製品の ID、名前、および関連するカテゴリ名が表示されます (フルサイズの画像を表示する をクリックします)。

まとめ

このチュートリアルでは、SqlDataSource コントロールを使用してデータのクエリと表示を行う方法について説明しました。 ObjectDataSource と同様に、SqlDataSource はプロキシとして機能し、データにアクセスするための宣言型アプローチを提供します。 そのプロパティは、接続するデータベースと実行する SQL SELECT クエリを指定します。これらのプロパティは、プロパティ ウィンドウまたは DataSource の構成ウィザードを使用して指定できます。

このチュートリアルで調べたクエリの例では SELECT 、指定したクエリからすべてのレコードが返されました。 ただし、SqlDataSource コントロールには、プログラムによって値が割り当てられるか、指定したソースから自動的にプルされるパラメーターを含む句を含 WHERE めることができます。 次のチュートリアルでは、パラメーター化されたクエリを作成して使用する方法について説明します。

幸せなプログラミング!

もっと読む

このチュートリアルで説明するトピックの詳細については、次のリソースを参照してください。

著者について

7 冊の ASP/ASP.NET 書籍の著者であり、 4GuysFromRolla.com の創設者である Scott Mitchell は、1998 年から Microsoft Web テクノロジと協力しています。 Scott は独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズ・ティーチ・自分自身 ASP.NET 24時間で2.0です。 にアクセスmitchell@4GuysFromRolla.comすることも、ブログを介して アクセスすることもできます。これは でhttp://ScottOnWriting.NET確認できます。

特別な感謝

このチュートリアル シリーズは、多くの役立つ校閲者によってレビューされました。 このチュートリアルのリード レビュー担当者は、Susan Connery、Bernadette Leigh、David Suru でした。 今後の MSDN 記事の確認に関心がありますか? その場合は、 に行mitchell@4GuysFromRolla.comをドロップしてください。