SqlDataSource コントロールによるデータの選択
更新 : 2007 年 11 月
SqlDataSource コントロールを使用すると、ほとんどコードを記述せずにデータベースからデータを取得できます。SqlDataSource コントロールは、構成ファイルの DbProviderFactories セクションの ADO.NET プロバイダが関連付けられている任意のデータベース (Microsoft SQL Server、Oracle、ODBC、または Microsoft Access などの OLE DB データベースなど) で使用できます。SqlDataSource で使用するように構成した SQL ステートメントの構文およびストアド プロシージャなどのさらに高度なデータベース機能が使用できるかどうかは、使用するデータベースによって決まります。ただし、データ ソース コントロールの動作はすべてのデータベースに対して同じです。
SqlDataSource コントロールを使用してデータベースからデータを取得するには、少なくとも次のプロパティを設定する必要があります。
ProviderName 操作するデータベースを表す ADO.NET プロバイダの名前に設定します。Microsoft SQL Server を使用する場合は ProviderName プロパティを "System.Data.SqlClient" に設定し、Oracle データベースを使用する場合は ProviderName プロパティを "System.Data.OracleClient" に設定し、その他のデータベースの場合も同様です。
ConnectionString データベースに使用する接続文字列に設定します。
SelectCommand データベースからデータを返す SQL クエリまたはストアド プロシージャに設定します。SelectCommand プロパティに設定するクエリは、ADO.NET データ アクセス コードを記述する際の ADO.NET IDbCommand オブジェクトの CommandText プロパティに設定するクエリと同じです。SQL クエリの実際の構文は、データのスキーマと使用するデータベースに依存します。
以下のセクションでは、これらのプロパティについて詳しく説明します。
プロバイダ名の指定
ProviderName プロパティをデータが格納されているデータベースに対応する ADO.NET プロバイダの名前に設定します。使用できるプロバイダの一覧は、Machine.config または Web.config 構成ファイルの DbProviderFactories セクションに登録します。既定では、SqlDataSource コントロールは Microsoft SQL Server に対応する System.Data.SqlClient ADO.NET プロバイダを使用します。したがって、SQL Server データベースに接続する場合は、明示的にプロバイダを指定する必要がありません。ただし、System.Data.OracleClient、System.Data.Odbc、または System.Data.OleDb プロバイダを指定することもできます。詳細については、「ADO.NET」を参照してください。
メモ : |
---|
ProviderName プロパティは、SQLOLEDB、MSDAORA などのアンマネージ ADO プロバイダには設定しないでください。 |
接続文字列の指定
ConnectionString プロパティを使用するデータベースの接続文字列に設定します。ただし、大規模サイトで SqlDataSource コントロールの ConnectionString プロパティを特定の接続文字列に設定すると保守性が低下します。また、接続文字列が ASP.NET ページにプレーンテキストで格納されます。Web アプリケーションの保守性と安全性を高めるために、接続文字列はアプリケーションの構成ファイルの connectionStrings 要素に格納することをお勧めします。次の例のような接続式を使用して格納されている接続文字列を参照します。
<asp:SqlDataSource
ID="SqlDataSource1"
runat="server"
ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
SelectCommand="SELECT * FROM [Categories]">
</asp:SqlDataSource>
セキュリティを強化するために、<connectionStrings> 構成セクションの内容を暗号化できます。詳細については、「構成セクションの暗号化と複合化」を参照してください。
Select コマンドの指定
SqlDataSource コントロールの SelectCommand プロパティを設定すると、コントロールで実行する SQL クエリを指定できます。Employees テーブルのすべての従業員の姓を含む結果セットを取得する SQL クエリの例を次に示します。
SELECT LastName FROM Employees;
SqlDataSource コントロールの ConnectionString プロパティと SelectCommand プロパティを設定して、GridView コントロールに Employees のデータを表示するコード例を次に示します。
<%@ Page language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" runat="server">
<asp:SqlDataSource
id="SqlDataSource1"
runat="server"
DataSourceMode="DataReader"
ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
SelectCommand="SELECT LastName FROM Employees">
</asp:SqlDataSource>
<asp:ListBox
id="ListBox1"
runat="server"
DataTextField="LastName"
DataSourceID="SqlDataSource1">
</asp:ListBox>
</form>
</body>
</html>
<%@ Page language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" runat="server">
<asp:SqlDataSource
id="SqlDataSource1"
runat="server"
DataSourceMode="DataReader"
ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
SelectCommand="SELECT LastName FROM Employees">
</asp:SqlDataSource>
<asp:ListBox
id="ListBox1"
runat="server"
DataTextField="LastName"
DataSourceID="SqlDataSource1">
</asp:ListBox>
</form>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" runat="server">
<asp:SqlDataSource
id="SqlDataSource1"
runat="server"
DataSourceMode="DataReader"
ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
SelectCommand="SELECT LastName FROM Employees">
</asp:SqlDataSource>
<asp:ListBox
id="ListBox1"
runat="server"
DataTextField="LastName"
DataSourceID="SqlDataSource1">
</asp:ListBox>
</form>
</body>
</html>
使用するデータベースがストアド プロシージャをサポートする場合、SelectCommand プロパティにストアド プロシージャの名前を設定し、SelectCommand プロパティがストアド プロシージャを参照するように、SelectCommandType プロパティを StoredProcedure に設定します。SQL Server で作成できる簡単なストアド プロシージャの例を次に示します。
CREATE PROCEDURE sp_GetAllEmployees AS
SELECT * FROM Employees;
GO
SqlDataSource がストアド プロシージャを使用するように構成するには、SelectCommand テキストを "sp_GetAllEmployees" に設定し、SelectCommandType プロパティを StoredProcedure に設定します。
ほとんどのストアド プロシージャはパラメータを使用します。ストアド プロシージャでパラメータを使用する方法の詳細については、「SqlDataSource コントロールにおけるパラメータの使用」を参照してください。
SqlDataSource コントロールは実行時に SelectCommand プロパティのテキストをデータベースに送信し、データベースはクエリまたはストアド プロシージャの結果を SqlDataSource コントロールに返します。このデータ ソース コントロールに連結されているすべての Web コントロールは、ASP.NET ページに結果セットを表示します。
SQL ステートメントにパラメータを渡す
多くの場合、ユーザーは実行時のみに解決または評価できるパラメータに基づいてデータをやり取りします。たとえば、ASP.NET Web ページに表示されるデータが特定の日のレポートを表すとします。ユーザーが別の日を選択すると、レポートのデータも変化します。日付がユーザーによって明示的に変更されるか、または Web アプリケーションによってプログラム的に変更されるかに関係なく、データベースに送信する SQL クエリがパラメータ化されていれば、SQL ステートメントの要素が Web アプリケーションの変数に連結され、実行時に評価されるので、柔軟性と保守性を高めることができます。
SqlDataSource コントロールは、SelectCommand クエリにプレースホルダを置き、追加するパラメータを SelectParameters コレクションに関連付けることによって、パラメータ化された SQL クエリをサポートします。パラメータ値は、ページ内の別のコントロール、セッション状態、ユーザー プロファイル、または他の要素から読み込むことができます。詳細については、「SqlDataSource コントロールにおけるパラメータの使用」を参照してください。
プレースホルダに使用する構文は、データベースの種類によって異なります。SQL Server を使用する場合、パラメータ名は '@' 文字で始まり、SelectParameters コレクションの Parameter オブジェクトの名前に対応します。ODBC データベースまたは OLE DB データベースを使用する場合、パラメータ化されたステートメントのパラメータは名前が付いていないので、代わりにプレースホルダ文字 '?' で指定します。
パラメータ化された SQL クエリが、ログイン中の従業員の ID に基づいて SQL Server の Northwind データベースのすべての注文を取得する方法の例を次に示します。
SELECT * FROM Orders WHERE EmployeeID = @empid
この例では、@empid 式が実行時に評価されるパラメータです。
ページ内の別のコントロールからパラメータ値を受け取るパラメータ化された SQL クエリのコード例を次に示します。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" runat="server">
<p><asp:dropdownlist
id="DropDownList1"
runat="server"
autopostback="True">
<asp:listitem selected="True">Sales Representative</asp:listitem>
<asp:listitem>Sales Manager</asp:listitem>
<asp:listitem>Vice President, Sales</asp:listitem>
</asp:dropdownlist></p>
<asp:sqldatasource
id="SqlDataSource1"
runat="server"
connectionstring="<%$ ConnectionStrings:MyNorthwind%>"
selectcommand="SELECT LastName FROM Employees WHERE Title = @Title">
<selectparameters>
<asp:controlparameter name="Title" controlid="DropDownList1" propertyname="SelectedValue"/>
</selectparameters>
</asp:sqldatasource>
<p><asp:listbox
id="ListBox1"
runat="server"
datasourceid="SqlDataSource1"
datatextfield="LastName">
</asp:listbox></p>
</form>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" runat="server">
<p><asp:dropdownlist
id="DropDownList1"
runat="server"
autopostback="True">
<asp:listitem selected="True">Sales Representative</asp:listitem>
<asp:listitem>Sales Manager</asp:listitem>
<asp:listitem>Vice President, Sales</asp:listitem>
</asp:dropdownlist></p>
<asp:sqldatasource
id="SqlDataSource1"
runat="server"
connectionstring="<%$ ConnectionStrings:MyNorthwind%>"
selectcommand="SELECT LastName FROM Employees WHERE Title = @Title">
<selectparameters>
<asp:controlparameter name="Title" controlid="DropDownList1" propertyname="SelectedValue"/>
</selectparameters>
</asp:sqldatasource>
<p><asp:listbox
id="ListBox1"
runat="server"
datasourceid="SqlDataSource1"
datatextfield="LastName">
</asp:listbox></p>
</form>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" runat="server">
<p><asp:DropDownList
id="DropDownList1"
runat="server"
AutoPostBack="True">
<asp:ListItem Selected="True">Sales Representative</asp:ListItem>
<asp:ListItem>Sales Manager</asp:ListItem>
<asp:ListItem>Vice President, Sales</asp:ListItem>
</asp:DropDownList></p>
<asp:SqlDataSource
id="SqlDataSource1"
runat="server"
ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
SelectCommand="SELECT LastName FROM Employees WHERE Title = @Title">
<SelectParameters>
<asp:ControlParameter Name="Title" ControlId="DropDownList1" PropertyName="SelectedValue"/>
</SelectParameters>
</asp:SqlDataSource>
<p><asp:ListBox
id="ListBox1"
runat="server"
DataSourceID="SqlDataSource1"
DataTextField="LastName">
</asp:ListBox></p>
</form>
</body>
</html>
SqlDataSource コントロールでパラメータを使用する方法の詳細については、「SqlDataSource コントロールにおけるパラメータの使用」を参照してください。データ ソースのパラメータの使用に関する一般的な情報については、「データ ソース コントロールとパラメータの使用」を参照してください。
データを返す方法の指定
SqlDataSource コントロールの DataSourceMode プロパティによって、SqlDataSource コントロールがデータを維持する方法が決まります。既定では、DataSourceMode プロパティが DataSet に設定され、データベースから返される結果セットが SqlDataSource コントロールによってサーバー メモリに格納されます。SqlDataSource コントロールが DataSet モードでデータを取得すると、GridView、DetailsView などの関連付けられたデータ連結コントロールは、自動ソートやページングなどの豊富なデータ表示機能を提供できます。
逆に、DataSourceMode プロパティを DataReader に設定すると、結果セットはメモリに格納されません。結果セットをサーバーのメモリに保持する必要がない場合は、DataReader モードを使用します。
ソート、ページング、またはフィルタ処理を必要としない場合に SqlDataSource コントロールの DataSourceMode プロパティを DataReader に設定するコード例を次に示します。
<%@ Page language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" runat="server">
<asp:SqlDataSource
id="SqlDataSource1"
runat="server"
DataSourceMode="DataReader"
ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
SelectCommand="SELECT LastName FROM Employees">
</asp:SqlDataSource>
<asp:ListBox
id="ListBox1"
runat="server"
DataTextField="LastName"
DataSourceID="SqlDataSource1">
</asp:ListBox>
</form>
</body>
</html>
<%@ Page language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" runat="server">
<asp:SqlDataSource
id="SqlDataSource1"
runat="server"
DataSourceMode="DataReader"
ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
SelectCommand="SELECT LastName FROM Employees">
</asp:SqlDataSource>
<asp:ListBox
id="ListBox1"
runat="server"
DataTextField="LastName"
DataSourceID="SqlDataSource1">
</asp:ListBox>
</form>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" runat="server">
<asp:SqlDataSource
id="SqlDataSource1"
runat="server"
DataSourceMode="DataReader"
ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
SelectCommand="SELECT LastName FROM Employees">
</asp:SqlDataSource>
<asp:ListBox
id="ListBox1"
runat="server"
DataTextField="LastName"
DataSourceID="SqlDataSource1">
</asp:ListBox>
</form>
</body>
</html>
SqlDataSource コントロール イベントを使用するカスタム処理の追加
SqlDataSource コントロールは、データを取得する前または後に独自のコードを実行するために処理できるイベントを公開します。
SqlDataSource コントロールは、Select メソッドを呼び出して SelectCommand プロパティの SQL クエリ セットを実行する前に Selecting イベントを発生します。この Selecting イベントを処理すると、SQL クエリを実行する前に確認し、SelectParameters コレクションに含まれるパラメータを検証したり、データを取得する前に他の作業を実行したりできます。たとえば、SqlDataSource コントロールと共に FormParameter を使用する場合、Selecting イベントを処理して、データを取得する前にパラメータの値を検証できます。FormParameter は、HTML 要素にポストされた値を受け取り、検証せずにデータベースに送信します。値が許容範囲にない場合、SqlDataSourceSelectingEventArgs オブジェクトの Cancel プロパティを true に設定してクエリをキャンセルできます。
SqlDataSource コントロールは、データの取得後に Selected イベントを発生します。Selected イベントを使用すると、データベース操作の間に例外がスローされたかどうかを確認したり、データ操作によって返される値を調べることができます。
データの表示
ASP.NET ページにデータを表示するには、GridView、DetailsView、FormView などのデータ連結コントロール、または ListBox、DropDownList などのコントロールを使用します。データ連結コントロールは、SqlDataSource コントロールが取得するデータのコンシューマとして動作します。データ連結コントロールの DataSourceID プロパティに SqlDataSource コントロールの ID を設定します。ページがレンダリングされると、SqlDataSource コントロールがデータを取得してデータ連結コントロールに提供し、データ連結コントロールがデータを表示します。データ連結コントロールの詳細、およびデータ連結コントロールとデータ ソース コントロールを使用してデータを表示する方法の詳細については、「ASP.NET のデータ バインド Web サーバー コントロールの概要」を参照してください。
GridView コントロールを使用してクエリの結果を表示するコード例を次に示します。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" runat="server">
<asp:SqlDataSource
id="SqlDataSource1"
runat="server"
DataSourceMode="DataReader"
ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
SelectCommand="SELECT FirstName, LastName, Title FROM Employees">
</asp:SqlDataSource>
<asp:GridView
id="GridView1"
runat="server"
DataSourceID="SqlDataSource1">
</asp:GridView>
</form>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" runat="server">
<asp:SqlDataSource
id="SqlDataSource1"
runat="server"
DataSourceMode="DataReader"
ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
SelectCommand="SELECT FirstName, LastName, Title FROM Employees">
</asp:SqlDataSource>
<asp:GridView
id="GridView1"
runat="server"
DataSourceID="SqlDataSource1">
</asp:GridView>
</form>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" runat="server">
<asp:SqlDataSource
id="SqlDataSource1"
runat="server"
DataSourceMode="DataReader"
ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
SelectCommand="SELECT FirstName, LastName, Title FROM Employees">
</asp:SqlDataSource>
<asp:GridView
id="GridView1"
runat="server"
DataSourceID="SqlDataSource1">
</asp:GridView>
</form>
</body>
</html>