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

作成者: Scott Mitchell

PDF のダウンロード

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

はじめに

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

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

ASP.NET 2.0 には、SqlDataSource、AccessDataSource、ObjectDataSourceXmlDataSourceSiteMapDataSource の 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 つの異なるコントロールにより、多くの開発者は、AccessDataSource コントロールが Microsoft SQL Serverと排他的に動作するように設計された SqlDataSource コントロールを使用して Microsoft Access と排他的に動作するように設計されていることを疑う、ASP.NET 2.0 を初めて使用します。 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] ノードに追加されたデータベースが含まれます。 フォルダー内App_DataのデータベースのNORTHWIND.MDF接続文字列がプロジェクトのWeb.configファイルに既に追加されているため、ドロップダウン リストには、その接続文字列 NORTHWINDConnectionStringへの参照が含まれています。 ドロップダウン リストからこの項目を選択し、[次へ] をクリックします。

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

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

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

注意

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

図 8 は、[テーブルまたはビューから列を指定する] ラジオ ボタンが選択されている場合の [ステートメントの選択の構成] 画面を示しています。 ドロップダウン リストには、Northwind データベース内のテーブルとビューのセットが含まれており、選択したテーブルまたはビューの列が下のチェックボックス リストに表示されます。 この例では、テーブルから 、ProductName、および UnitPrice 列をProductsProductIDします。 図 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 Product Name に、フィールド s を 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 には各製品の 、、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 はクエリによって返されるレコードの数を確認できず、DataReader では返されたデータを並べ替えるための手法も提供されないので、データ Web コントロールは並べ替えもページもできません。

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

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

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

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

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

ウィザードが完了すると、GridView に 3 つの BoundFields が追加され、クエリから返された 、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 は、独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズは24時間で2.0 ASP.NET 自分自身を教えています。 にアクセスするか、ブログを使用して にアクセスmitchell@4GuysFromRolla.comできます。これは でhttp://ScottOnWriting.NET見つけることができます。

特別な感謝

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