パラメーター化されたクエリと SqlDataSource を使用する (VB)
このチュートリアルでは、SqlDataSource コントロールを引き続き確認し、パラメーター化されたクエリを定義する方法について説明します。 パラメーターは、宣言とプログラムの両方で指定でき、クエリ文字列、セッション状態、その他のコントロールなど、さまざまな場所からプルできます。
はじめに
前のチュートリアルでは、SqlDataSource コントロールを使用してデータベースから直接データを取得する方法について説明しました。 データ ソースの構成ウィザードを使用して、データベースを選択し、テーブルまたはビューから返す列を選択できます。カスタム SQL ステートメントを入力します。ストアド プロシージャを使用します。 テーブルまたはビューから列を選択するか、カスタム SQL ステートメントを入力するかに関係なく、SqlDataSource コントロールの SelectCommand
プロパティには、結果のアドホック SQL SELECT
ステートメントが割り当てられます。この SELECT
ステートメントは、SqlDataSource の Select()
メソッドが呼び出されたときに実行されます (プログラムまたはデータ Web コントロールから自動的に実行されます)。
前のチュートリアルのデモで使用した SQL SELECT
ステートメントには句がありません WHERE
。 ステートメントでは SELECT
、 句を WHERE
使用して、返される結果を制限できます。 たとえば、50.00 ドルを超える製品の名前を表示するには、次のクエリを使用できます。
SELECT ProductName
FROM Products
WHERE UnitPrice > 50.00
通常、句で WHERE
使用される値は、クエリ文字列値、セッション変数、ページ上の Web コントロールからのユーザー入力など、一部の外部ソースによって決定されます。 このような入力は、パラメーターを使用して指定されるのが理想的 です。 Microsoft SQL Serverでは、パラメーターは 次のように を使用して@parameterName
示されます。
SELECT ProductName
FROM Products
WHERE UnitPrice > @Price
SqlDataSource では、パラメーター化されたクエリ (ステートメントと 、、および UPDATE
INSERT
ステートメントのSELECT
両方) がDELETE
サポートされています。 さらに、パラメーター値は、クエリ文字列、セッション状態、ページ上のコントロールなど、さまざまなソースから自動的にプルできます。また、プログラムによって割り当てることもできます。 このチュートリアルでは、パラメーター化されたクエリを定義する方法と、宣言型とプログラム型の両方でパラメーター値を指定する方法について説明します。
注意
前のチュートリアルでは、最初の 46 個のチュートリアルで選択した ObjectDataSource を SqlDataSource と比較し、概念上の類似点に注意しました。 これらの類似点は、パラメーターにも及びます。 ObjectDataSource のパラメーターは、ビジネス ロジック レイヤー内のメソッドの入力パラメーターにマップされます。 SqlDataSource では、パラメーターは SQL クエリ内で直接定義されます。 どちらのコントロールにも、 Select()
、 Insert()
、 Update()
および Delete()
メソッドのパラメーターのコレクションがあり、どちらも、事前に定義されたソース (クエリ文字列値、セッション変数など) からこれらのパラメーター値を設定したり、プログラムで割り当てたりできます。
パラメーター クエリの作成
SqlDataSource コントロールのデータ ソースの構成ウィザードには、データベース レコードを取得するために実行するコマンドを定義するための 3 つの方法があります。
- 既存のテーブルまたはビューから列を選択すると、
- カスタム SQL ステートメントを入力するか、
- ストアド プロシージャを選択する
既存のテーブルまたはビューから列を選択する場合は、[句の追加WHERE
] ダイアログ ボックスでWHERE
句のパラメーターを指定する必要があります。 ただし、カスタム SQL ステートメントを作成する場合は、 句に WHERE
パラメーターを直接入力できます (各パラメーターを示すために を使用 @parameterName
)。 ストアド プロシージャは 1 つ以上の SQL ステートメントで構成され、これらのステートメントはパラメーター化できます。 ただし、SQL ステートメントで使用されるパラメーターは、ストアド プロシージャに入力パラメーターとして渡す必要があります。
パラメーター化されたクエリの作成は SqlDataSource の SelectCommand
指定方法によって異なるため、3 つのアプローチをすべて見てみましょう。 作業を開始するには、フォルダー内のページをParameterizedQueries.aspx
SqlDataSource
開き、SqlDataSource コントロールをツールボックスから Designer にドラッグし、その コントロールID
を にProducts25BucksAndUnderDataSource
設定します。 次に、コントロールのスマート タグから [データ ソースの構成] リンクをクリックします。 使用するデータベース (NORTHWINDConnectionString
) を選択し、[次へ] をクリックします。
手順 1: テーブルまたはビューから列を選択するときに WHERE 句を追加する
SqlDataSource コントロールを使用してデータベースから返すデータを選択する場合、データ ソースの構成ウィザードを使用すると、既存のテーブルまたはビューから返す列を選択できます (図 1 を参照)。 これにより、SQL SELECT
ステートメントが自動的に作成されます。これは、SqlDataSource の Select()
メソッドが呼び出されたときにデータベースに送信されます。 前のチュートリアルで行ったように、ドロップダウン リストから Products テーブルを選択し、および UnitPrice
列をProductID
ProductName
チェックします。
図 1: テーブルまたはビューから返す列を選択する (フルサイズの画像を表示する をクリックします)
ステートメントに句をWHERE
含めるには、 ボタンをWHERE
クリックすると、[句の追加WHERE
] ダイアログ ボックスが表示されます (図 2 をSELECT
参照)。 クエリによって返される結果を制限するパラメーターを SELECT
追加するには、最初にデータをフィルター処理する列を選択します。 次に、フィルター処理に使用する演算子 (=、、、<<=、>、など) を選択します。 最後に、クエリ文字列やセッション状態などのパラメーターの値のソースを選択します。 パラメーターを構成したら、[追加] ボタンをクリックしてクエリに SELECT
含めます。
この例では、値が UnitPrice
$25.00 以下の結果のみを返します。 したがって、[列] ドロップダウン リストからを選択 UnitPrice
し <、[演算子] ドロップダウン リストから = を選択します。 ハードコーディングされたパラメーター値 ($25.00 など) を使用する場合、またはパラメーター値をプログラムで指定する場合は、[ソース] ドロップダウン リストから [なし] を選択します。 次に、[値] ボックス 25.00 にハードコーディングされたパラメーター値を入力し、[追加] ボタンをクリックしてプロセスを完了します。
図 2: [句の追加 WHERE
] ダイアログ ボックスから返される結果を制限する (クリックするとフルサイズの画像が表示されます)
パラメーターを追加した後、[OK] をクリックしてデータ ソースの構成ウィザードに戻ります。 SELECT
ウィザードの下部にある ステートメントに、 という名前@UnitPrice
のパラメーターをWHERE
持つ 句が含まれるようになりました。
SELECT [ProductID], [ProductName], [UnitPrice]
FROM [Products]
WHERE ([UnitPrice] <= @UnitPrice)
注意
[句の WHERE
追加 WHERE
] ダイアログ ボックスで句に複数の条件を指定すると、ウィザードによって演算子と AND
結合されます。 句 (などWHERE UnitPrice <= @UnitPrice OR Discontinued = 1
) に をOR
WHERE
含める必要がある場合は、カスタム SQL ステートメント画面をSELECT
使用してステートメントをビルドする必要があります。
SqlDataSource の構成を完了し ([次へ]、[完了] の順にクリック)、SqlDataSource の宣言型マークアップを調べます。 マークアップに コレクションが <SelectParameters>
含まれるようになりました。これにより、 内のパラメーターのソースがスペルアウトされます SelectCommand
。
<asp:SqlDataSource ID="Products25BucksAndUnderDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand=
"SELECT [ProductID], [ProductName], [UnitPrice]
FROM [Products] WHERE ([UnitPrice] <= @UnitPrice)">
<SelectParameters>
<asp:Parameter DefaultValue="25.00" Name="UnitPrice" Type="Decimal" />
</SelectParameters>
</asp:SqlDataSource>
SqlDataSource の Select()
メソッドが呼び出されると、 UnitPrice
データベースに送信される前に @UnitPrice
、 の パラメーター値 (25.00) が パラメーターに SelectCommand
適用されます。 結果として、$25.00 以下の製品のみがテーブルから Products
返されます。 これを確認するには、ページに GridView を追加し、このデータ ソースにバインドしてから、ブラウザーを使用してページを表示します。 図 3 で確認されているように、$25.00 以下の製品のみが表示されます。
図 3: $25.00 以下の製品のみが表示されます (クリックするとフルサイズの画像が表示されます)
手順 2: カスタム SQL ステートメントへのパラメーターの追加
カスタム SQL ステートメントを追加する場合は、 句を WHERE
明示的に入力するか、クエリ ビルダーの [フィルター] セルに値を指定できます。 これを示すために、価格が特定のしきい値より小さい製品のみを GridView に表示してみましょう。 まず、TextBox をページに追加して、 ParameterizedQueries.aspx
このしきい値をユーザーから収集します。 TextBox の プロパティを ID
に MaxPrice
設定します。 Button Web コントロールを追加し、そのプロパティを Text
[Display Matching Products]\(一致する製品の表示\) に設定します。
次に、GridView をページにドラッグし、スマート タグから という名前 ProductsFilteredByPriceDataSource
の新しい SqlDataSource を作成することを選択します。 データ ソースの構成ウィザードから、[カスタム SQL ステートメントまたはストアド プロシージャの指定] 画面 (図 4 を参照) に進み、次のクエリを入力します。
SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice OR @MaximumPrice = -1.0
クエリを入力した後 (手動またはクエリ ビルダーを使用して)、[次へ] をクリックします。
図 4: パラメーター値以下の製品のみを返す (フルサイズの画像を表示する をクリックします)
クエリにはパラメーターが含まれるため、ウィザードの次の画面でパラメーター値のソースの入力を求められます。 [パラメーター ソース] ドロップダウン リストから [コントロール] を選択し MaxPrice
、[ControlID] ドロップダウン リストから (TextBox コントロールの ID
値) を選択します。 また、ユーザーが TextBox にテキストを入力していない場合に使用する省略可能な既定値を MaxPrice
入力することもできます。 当面は、既定値を入力しないでください。
図 5: MaxPrice
TextBox の Text
プロパティがパラメーター ソースとして使用されている (フルサイズの画像を表示する をクリックします)
[次へ]、[完了] の順にクリックして、データ ソースの構成ウィザードを完了します。 GridView、TextBox、Button、および SqlDataSource の宣言型マークアップは次のとおりです。
Maximum price:
$<asp:TextBox ID="MaxPrice" runat="server" Columns="5" />
<asp:Button ID="DisplayProductsLessThanButton" runat="server"
Text="Display Matching Products" />
<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False"
DataSourceID="ProductsFilteredByPriceDataSource" EnableViewState="False">
<Columns>
<asp:BoundField DataField="ProductName" HeaderText="Product"
SortExpression="ProductName" />
<asp:BoundField DataField="UnitPrice" HeaderText="Price"
HtmlEncode="False" DataFormatString="{0:c}"
SortExpression="UnitPrice" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="ProductsFilteredByPriceDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand=
"SELECT ProductName, UnitPrice
FROM Products WHERE UnitPrice <= @MaximumPrice">
<SelectParameters>
<asp:ControlParameter ControlID="MaxPrice" Name="MaximumPrice"
PropertyName="Text" />
</SelectParameters>
</asp:SqlDataSource>
SqlDataSource セクション内の <SelectParameters>
パラメーターは であり、 ControlParameter
や PropertyName
などのControlID
追加のプロパティが含まれています。 SqlDataSource の Select()
メソッドが呼び出されると、 ControlParameter
は指定された Web コントロール プロパティから値を取得し、 内 SelectCommand
の対応するパラメーターに割り当てます。 この例では、 MaxPrice
パラメーター値として s Text プロパティを @MaxPrice
使用します。
ブラウザーを使用してこのページを表示するには、少し時間がかかります。 最初にページにアクセスするとき、または TextBox に MaxPrice
値がない場合は常に、GridView にレコードは表示されません。
図 6: TextBox が空の場合 MaxPrice
、レコードは表示されません (フルサイズの画像を表示する をクリックします)
製品が表示されない理由は、パラメーター値の空の文字列が既定でデータベース NULL
値に変換されるためです。 の [UnitPrice] <= NULL
比較は常に False と評価されるため、結果は返されません。
テキスト ボックスに値 (5.00 など) を入力し、[一致する製品の表示] ボタンをクリックします。 ポストバック時に、SqlDataSource は、パラメーター ソースの 1 つが変更されたことを GridView に通知します。 その結果、GridView は SqlDataSource に再バインドされ、$5.00 以下の製品が表示されます。
図 7: $5.00 以下の製品が表示されます (フルサイズの画像を表示する をクリックします)
最初にすべての製品を表示する
ページが最初に読み込まれるときに製品を表示するのではなく、 すべての 製品を表示することをお勧めします。 TextBox が空のときにすべての MaxPrice
製品を一覧表示する方法の 1 つは、Northwind Traders が単価が $1,000,000 を超える在庫を持つ可能性は低いため、パラメーターの既定値を 1000000 のような非常に高い値に設定することです。 ただし、このアプローチは近視眼的であり、他の状況では機能しない可能性があります。
前のチュートリアル - 宣言型パラメーター と 、DropDownList を使用したマスター/詳細フィルター処理でも 、同様の問題が発生しました。 このソリューションでは、このロジックをビジネス ロジック レイヤーに配置する必要があります。 具体的には、BLL は受信値を調べ、その値がまたは予約値である NULL
場合は、すべてのレコードを返す DAL メソッドに呼び出しがルーティングされました。 受信値が通常のフィルター値の場合は、指定された値を持つパラメーター化された WHERE
句を使用する SQL ステートメントを実行する DAL メソッドを呼び出しました。
残念ながら、SqlDataSource を使用する場合はアーキテクチャをバイパスします。 代わりに、パラメーターNULL
が または 予約値である場合は、SQL ステートメントをカスタマイズして、すべてのレコードを@MaximumPrice
インテリジェントに取得する必要があります。 この演習では、 パラメーターが と等しい-1.0
場合@MaximumPrice
は、すべてのレコードが返されるようにします (-1.0
製品に負UnitPrice
の値を指定できないため、予約値として機能します)。 これを実現するには、次の SQL ステートメントを使用します。
SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice OR @MaximumPrice = -1.0
この句は WHERE
、 パラメーターが と等しい場合 に、すべての レコードを @MaximumPrice
返します -1.0
。 パラメーター値が でない-1.0
場合は、パラメーター値以下@MaximumPrice
の製品UnitPrice
のみが返されます。 パラメーターの既定値を @MaximumPrice
に-1.0
設定すると、最初のページ読み込み時 (または TextBox が空@MaximumPrice
の場合)MaxPrice
、 の-1.0
値が になり、すべての製品が表示されます。
図 8: TextBox が空の場合 MaxPrice
、すべての製品が表示されるようになりました (クリックするとフルサイズの画像が表示されます)
この方法には注意すべき点がいくつかあります。 まず、パラメーターのデータ型が SQL クエリでの使用によって推論されることを認識します。 句を WHERE
から @MaximumPrice = -1.0
に @MaximumPrice = -1
変更すると、ランタイムは パラメーターを整数として扱います。 その後、TextBox を 10 進値 (5.00 など) に割り当て MaxPrice
ようとすると、5.00 を整数に変換できないため、エラーが発生します。 これを解決するには、 句で を使用@MaximumPrice = -1.0
するか、オブジェクトの Type
プロパティを WHERE
ControlParameter
Decimal に設定します。
第 2 に、 句に をWHERE
追加OR @MaximumPrice = -1.0
すると、クエリ エンジンは にUnitPrice
インデックスを使用できないため (存在する場合)、テーブル スキャンが発生します。 テーブルに十分な数のレコードがある場合、パフォーマンスに影響を Products
与える可能性があります。 このロジックをストアド プロシージャIF
に移動すると、すべてのレコードを返す必要があるときにステートメントが句なしでWHERE
テーブルからProducts
クエリを実行するか、インデックスWHERE
を使用できるように句に条件だけがUnitPrice
含まれるクエリを実行SELECT
することをお勧めします。
手順 3: パラメーター化されたストアド プロシージャの作成と使用
ストアド プロシージャには、ストアド プロシージャ内で定義されている SQL ステートメントで使用できる一連の入力パラメーターを含めることができます。 入力パラメーターを受け取るストアド プロシージャを使用するように SqlDataSource を構成する場合、これらのパラメーター値は、アドホック SQL ステートメントと同じ手法を使用して指定できます。
SqlDataSource でストアド プロシージャを使用する方法を示すために、 という名前の Northwind データベースに新しいストアド プロシージャを作成します。これは、 という GetProductsByCategory
名前 @CategoryID
のパラメーターを受け取り、列が と一致するすべての列 CategoryID
を返します @CategoryID
。 ストアド プロシージャを作成するには、サーバー エクスプローラーに移動し、データベースにドリルダウンしますNORTHWND.MDF
。 ([サーバー] エクスプローラーが表示されない場合は、[表示] メニューに移動し、[サーバー エクスプローラー] オプションを選択して表示します)。
データベースから NORTHWND.MDF
[ストアド プロシージャ] フォルダーを右クリックし、[新しいストアド プロシージャの追加] を選択し、次の構文を入力します。
CREATE PROCEDURE dbo.GetProductsByCategory
(
@CategoryID int
)
AS
SELECT *
FROM Products
WHERE CategoryID = @CategoryID
[保存] アイコン (または Ctrl + S キー) をクリックしてストアド プロシージャを保存します。 ストアド プロシージャをテストするには、[ストアド プロシージャ] フォルダーから右クリックし、[実行] を選択します。 これにより、ストアド プロシージャのパラメーター (@CategoryID
このインスタンスでは) の入力が求められます。その後、結果が [出力] ウィンドウに表示されます。
図 9: GetProductsByCategory
を 1 で実行した @CategoryID
場合のストアド プロシージャ (フルサイズの画像を表示する 場合はクリックします)
このストアド プロシージャを使用して、GridView の [飲料] カテゴリのすべての製品を表示してみましょう。 ページに新しい GridView を追加し、 という名前 BeverageProductsDataSource
の新しい SqlDataSource にバインドします。 [カスタム SQL ステートメントまたはストアド プロシージャの指定] 画面に進み、[ストアド プロシージャ] ラジオ ボタンを選択し、ドロップダウン リストからストアド プロシージャを選択 GetProductsByCategory
します。
図 10: Drop-Down リストからストアド プロシージャを選択 GetProductsByCategory
します (フルサイズの画像を表示する をクリックします)
ストアド プロシージャは入力パラメーター (@CategoryID
) を受け取るので、[次へ] をクリックすると、このパラメーターの値のソースを指定するように求められます。 [飲み物 CategoryID
] は 1 なので、[パラメーター ソース] ドロップダウン リストを [なし] のままにし、[DefaultValue] ボックスに「1」と入力します。
図 11: Hard-Coded 値 1 を使用して飲料カテゴリの製品を返す (フルサイズの画像を表示する をクリックします)
次の宣言マークアップが示すように、ストアド プロシージャを使用する場合、SqlDataSource の SelectCommand
プロパティはストアド プロシージャの名前に設定され、 プロパティは にStoredProcedure
設定されSelectCommandType
、 がアドホック SQL ステートメントではなくストアド プロシージャの名前であることをSelectCommand
示します。
<asp:SqlDataSource ID="BeverageProductsDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand="GetProductsByCategory" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:Parameter DefaultValue="1" Name="CategoryID" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>
ブラウザーでページをテストします。 [飲料] カテゴリに属する製品のみが表示されますが、ストアド プロシージャはテーブルからすべての列を返すのGetProductsByCategory
で、すべての製品フィールドがProducts
表示されます。 もちろん、GridView の [列の編集] ダイアログ ボックスから、GridView に表示されるフィールドを制限またはカスタマイズできます。
図 12: すべての飲み物が表示されます (フルサイズの画像を表示する をクリックします)
手順 4: SqlDataSource の Select() ステートメントをプログラムで呼び出す
前のチュートリアルとこのチュートリアルで見た例では、SqlDataSource コントロールを GridView に直接バインドしました。 ただし、SqlDataSource コントロールのデータは、コード内でプログラムからアクセスして列挙できます。 これは、データを検査するためにクエリを実行する必要があるが、表示する必要がない場合に特に便利です。 データベースに接続し、コマンドを指定して結果を取得するために、すべての定型 ADO.NET コードを記述する必要はなく、SqlDataSource でこの単調なコードを処理できます。
SqlDataSource のデータをプログラムで操作する方法を説明するために、上司から、ランダムに選択されたカテゴリとその関連製品の名前を表示する Web ページを作成する要求を受け取ったとします。 つまり、ユーザーがこのページにアクセスすると、テーブルから Categories
カテゴリをランダムに選択し、カテゴリ名を表示して、そのカテゴリに属する製品を一覧表示します。
これを実現するには、テーブルからランダムなカテゴリを取得するための 2 つの SqlDataSource コントロールと、カテゴリの製品を Categories
取得するための 2 つの SqlDataSource コントロールが必要です。 この手順では、ランダムなカテゴリ レコードを取得する SqlDataSource をビルドします。手順 5 では、カテゴリの製品を取得する SqlDataSource の作成について説明します。
まず、 に SqlDataSource を ParameterizedQueries.aspx
追加し、 を ID
に設定します RandomCategoryDataSource
。 次の SQL クエリを使用するように構成します。
SELECT TOP 1 CategoryID, CategoryName
FROM Categories
ORDER BY NEWID()
ORDER BY NEWID()
は、ランダムな順序で並べ替えられたレコードを返します (「 Using to NEWID()
Randomly Sort Records」を参照)。 SELECT TOP 1
は、結果セットから最初のレコードを返します。 まとめますと、このクエリは、ランダムに選択された 1 つのカテゴリから 列と CategoryName
列の値を返CategoryID
します。
カテゴリの CategoryName
値を表示するには、Label Web コントロールをページに追加し、そのプロパティを ID
に CategoryNameLabel
設定し、そのプロパティを Text
クリアします。 SqlDataSource コントロールからプログラムでデータを取得するには、その Select()
メソッドを呼び出す必要があります。 メソッドではSelect()
、 型DataSourceSelectArguments
の単一の入力パラメーターが必要です。これは、返される前にデータをメッセージ化する方法を指定します。 これには、データの並べ替えとフィルター処理に関する手順が含まれます。また、SqlDataSource コントロールのデータを並べ替えたりページングしたりする際に、データ Web コントロールによって使用されます。 ただし、この例では、返される前にデータを変更する必要がないため、 オブジェクトを DataSourceSelectArguments.Empty
渡します。
メソッドは Select()
、 を実装する オブジェクトを返します IEnumerable
。 返される正確な型は、SqlDataSource コントロールの プロパティのDataSourceMode
値によって異なります。 前のチュートリアルで説明したように、このプロパティは または DataReader
のいずれかのDataSet
値に設定できます。 に DataSet
設定すると、 メソッドは Select()
DataView オブジェクトを返します。に DataReader
設定すると、 を実装するオブジェクトが返されます IDataReader
。 RandomCategoryDataSource
SqlDataSource のプロパティは DataSourceMode
(既定値) にDataSet
設定されているため、DataView オブジェクトを操作します。
次のコードは、SqlDataSource から DataView としてレコードを RandomCategoryDataSource
取得する方法と、最初の DataView 行から列値を CategoryName
読み取る方法を示しています。
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Load
' Get the data from the SqlDataSource as a DataView
Dim randomCategoryView As DataView = CType _
(RandomCategoryDataSource.Select(DataSourceSelectArguments.Empty), DataView)
If randomCategoryView.Count > 0 Then
' Assign the CategoryName value to the Label
CategoryNameLabel.Text = String.Format( _
"Here are Products in the {0} Category...", _
randomCategoryView(0)("CategoryName").ToString())
End If
End Sub
randomCategoryView(0)
は DataView の最初 DataRowView
の を返します。 randomCategoryView(0)("CategoryName")
は、この最初の行の CategoryName
列の値を返します。 DataView は緩やかに型指定されていることに注意してください。 特定の列値を参照するには、列の名前を文字列として渡す必要があります (この場合は CategoryName)。 図 13 は、ページを表示するときに に CategoryNameLabel
表示されるメッセージを示しています。 もちろん、表示される実際のカテゴリ名は、ページへのアクセスごとに SqlDataSource によって RandomCategoryDataSource
ランダムに選択されます (ポストバックを含む)。
図 13: ランダムに選択されたカテゴリの名前が表示されます (クリックするとフルサイズの画像が表示されます)
注意
SqlDataSource コントロールの DataSourceMode
プロパティが に DataReader
設定されている場合、メソッドからの戻り値を Select()
にキャストする IDataReader
必要がありました。 最初の行から列の CategoryName
値を読み取るために、次のようなコードを使用します。
If randomCategoryReader.Read() Then
Dim categoryName as String = randomCategoryReader("CategoryName').ToString()
...
End If
SqlDataSource がカテゴリをランダムに選択すると、カテゴリの製品を一覧表示する GridView を追加する準備が整いました。
注意
ラベル Web コントロールを使用してカテゴリの名前を表示するのではなく、ページに FormView または DetailsView を追加し、SqlDataSource にバインドすることができます。 ただし、Label を使用すると、SqlDataSource の Select()
ステートメントをプログラムで呼び出し、その結果のデータをコードで操作する方法を調べることができます。
手順 5: プログラムによるパラメーター値の割り当て
このチュートリアルでこれまでに見てきたすべての例では、ハードコーディングされたパラメーター値または定義済みのパラメーター ソース (クエリ文字列値、ページ上の Web コントロールなど) から取得したパラメーター値を使用してきました。 ただし、SqlDataSource コントロールのパラメーターをプログラムで設定することもできます。 現在の例を完了するには、指定したカテゴリに属するすべての製品を返す SqlDataSource が必要です。 この SqlDataSource には CategoryID
、イベント ハンドラーで SqlDataSource によって返される列値に CategoryID
基づいて値を RandomCategoryDataSource
設定する必要があるパラメーターがあります Page_Load
。
まず、ページに GridView を追加し、 という名前 ProductsByCategoryDataSource
の新しい SqlDataSource にバインドします。 手順 3 で行ったように、ストアド プロシージャを呼び出すように SqlDataSource を GetProductsByCategory
構成します。 [パラメーター ソース] ドロップダウン リストは [なし] のままにしますが、この既定値はプログラムによって設定されるため、既定値は入力しないでください。
図 14: パラメーター ソースまたは既定値を指定しない (フルサイズの画像を表示する をクリックします)
SqlDataSource ウィザードを完了すると、結果の宣言型マークアップは次のようになります。
<asp:SqlDataSource ID="ProductsByCategoryDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand="GetProductsByCategory" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:Parameter Name="CategoryID" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>
イベント ハンドラーでプログラムCategoryID
で パラメーターの をPage_Load
割り当てることができますDefaultValue
。
' Assign the ProductsByCategoryDataSource's
' CategoryID parameter's DefaultValue property
ProductsByCategoryDataSource.SelectParameters("CategoryID").DefaultValue = _
randomCategoryView(0)("CategoryID").ToString()
この追加により、ページには、ランダムに選択されたカテゴリに関連付けられている製品を示す GridView が含まれます。
図 15: パラメーター のソースまたは既定値を指定しない (フルサイズの画像を表示する をクリックします)
まとめ
SqlDataSource を使用すると、ページ開発者は、パラメーター値をハードコーディングしたり、定義済みのパラメーター ソースからプルしたり、プログラムで割り当てたりできるパラメーター化クエリを定義できます。 このチュートリアルでは、アドホック SQL クエリとストアド プロシージャの両方について、データ ソースの構成ウィザードからパラメーター化されたクエリを作成する方法について説明しました。 また、ハードコーディングされたパラメーター ソース、Web コントロールをパラメーター ソースとして使用し、プログラムでパラメーター値を指定する方法についても説明しました。
ObjectDataSource と同様に、SqlDataSource には基になるデータを変更する機能も用意されています。 次のチュートリアルでは、SqlDataSource を使用して、、UPDATE
、および DELETE
ステートメントを定義INSERT
する方法について説明します。 これらのステートメントを追加したら、GridView、DetailsView、および FormView コントロールに固有の組み込みの挿入、編集、および削除機能を利用できます。
幸せなプログラミング!
著者について
7 冊の ASP/ASP.NET 書籍の著者であり、 4GuysFromRolla.com の創設者である Scott Mitchell は、1998 年から Microsoft Web テクノロジと協力しています。 Scott は独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズ・ティーチ・自分自身 ASP.NET 24時間で2.0です。 にアクセスmitchell@4GuysFromRolla.comすることも、ブログを介して アクセスすることもできます。これは でhttp://ScottOnWriting.NET確認できます。
特別な感謝
このチュートリアル シリーズは、多くの役立つ校閲者によってレビューされました。 このチュートリアルのリード レビュー担当者は、Scott Clyde、Randell Schmidt、Ken Pespisa でした。 今後の MSDN 記事の確認に関心がありますか? その場合は、 に行mitchell@4GuysFromRolla.comをドロップしてください。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示