データ ソース コントロールとパラメータの使用

更新 : 2007 年 11 月

ASP.NET のデータ ソース コントロールは、実行時に値を渡すことができるように、入力パラメータを受け取ることができます。パラメータを使用すると、データを取得するための検索条件、データ ストアで挿入、更新、または削除する値、および並べ替え、ページング、フィルタ処理のための値を指定できます。パラメータを使用すると、データをフィルタし、カスタム コードをほとんど使用せずにマスター/詳細アプリケーションを作成できます。

パラメータを使用すると、自動更新、送信、および削除操作をサポートする GridView コントロール、FormView コントロールなどのデータ連結コントロールによってデータ ソースに渡された値をカスタマイズすることもできます。たとえば、パラメータ オブジェクトを使用して、値を厳密に型指定したり、出力値をデータ ソースから取得できます。さらに、パラメータ クエリを使用すると、アプリケーションを SQL 注入攻撃から守ることによってセキュリティを強化できます。

パラメータ値は、さまざまなソースから取得できます。Parameter のオブジェクトを使用すると、Web サーバー コントロールのプロパティ、Cookie、セッション状態、QueryString のフィールド、ユーザー プロファイル プロパティ、およびその他のソースから、値をパラメータ化されたデータ操作に提供できます。

パラメータの型

Web アプリケーションでは、さまざまな型のパラメータ オブジェクトを指定できます。パラメータ オブジェクトの型によって、パラメータ値を取得する場所が決まります。Parameter クラスはすべてのパラメータ オブジェクトの基本クラスで、すべてのパラメータ型に共通する NameTypeDirection、および DefaultValue の各プロパティを含みます。一般に、Parameter 基本クラスを使用すると、GridView コントロールが Update 操作または Delete 操作のために渡す値など、関連付けられたデータ連結コントロールから取得するパラメータ値をデータ ソースが処理する方法を指定できます。

Parameter クラスから派生するパラメータ型を使用すると、次の表に説明されているように、他のソースから値を取得できます。

パラメータの型

説明

ControlParameter

ASP.NET Web ページの Control のプロパティ値にパラメータを設定します。ControlID プロパティ使用して Control を指定します。ControlParameter オブジェクトの PropertyName プロパティを使用して、パラメータ値を提供するプロパティの名前を指定します。

Control から派生する一部のコントロールは、コントロールの値を取得する既定のプロパティを決定する ControlValuePropertyAttribute を定義します。PropertyName プロパティが明示的に設定されていない場合は、常に既定のプロパティが使用されます。ControlValuePropertyAttribute は、次のコントロールのプロパティに適用されます。

CookieParameter

パラメータを HttpCookie オブジェクトの値に設定します。CookieName プロパティを使用して、HttpCookie オブジェクトの名前を指定します。指定された HttpCookie オブジェクトが存在しない場合、DefaultValue プロパティの値がパラメータ値として使用されます。

xt50s8kz.alert_note(ja-jp,VS.90).gifメモ :
単独の値を持つ Cookie のみがサポートされます。

FormParameter

パラメータを HTML フォーム フィールドの値に設定します。FormField プロパティを使用して、HTML フォーム フィールドの名前を指定します。指定された HTML フォーム フィールドの値が存在しない場合、DefaultValue プロパティの値がパラメータ値として使用されます。

ProfileParameter

パラメータを現在のユーザー プロファイル (Profile) のプロパティの値に設定します。PropertyName プロパティを使用して、プロファイル プロパティの名前を指定します。指定されたプロファイル プロパティが存在しない場合、DefaultValue プロパティの値がパラメータ値として使用されます。

ユーザー プロファイルについては、「ASP.NET プロファイル プロパティの概要」を参照してください。

QueryStringParameter

パラメータを QueryString フィールドの値に設定します。QueryStringField プロパティを使用して、QueryString フィールドの名前を指定します。指定された QueryString フィールドが存在しない場合、DefaultValue プロパティの値がパラメータ値として使用されます。

SessionParameter

パラメータを Session オブジェクトの値に設定します。SessionField プロパティを使用して、Session オブジェクトの名前を指定します。指定された Session オブジェクトが存在しない場合、DefaultValue プロパティの値がパラメータ値として使用されます。

パラメータ値の厳密な型指定

既定では、パラメータは Object 型になります。パラメータ値が DateTimeInt32 などの別の型の場合は、Parameter のオブジェクトを明示的に作成し、パラメータの Type プロパティを TypeCode の値に設定できます。

パラメータの方向

既定では、パラメータは入力パラメータです。ストアド プロシージャを使用する場合などは、データ ソースが返す値を読み込む必要があります。そのような場合は、Parameter オブジェクトの Direction プロパティを設定して、データ ソースが Web アプリケーションに返す情報を確実に取得できるようにします。サポートされているパラメータの方向の設定は、InputInputOutputOutput、および ReturnValue です。データ操作を完了した後にパラメータの戻り値を取得するには、一般に Inserted イベント、Updatedイベントなどのデータ ソース コントロールのイベントを処理します。

データ ソース コントロールとパラメータ

データ ソース コントロールは、各種のパラメータ化された操作をサポートします。たとえば、LinqDataSource コントロールを使用すると、LINQ クエリの句に実行時の値を代入できます。SqlDataSource コントロールと AccessDataSource コントロールでは、SQL ステートメントで SelectCommand などのパラメータ プレースホルダを指定できます。ObjectDataSource コントロールは、SelectMethod などの特定のデータ操作を実行するためにパラメータを使用して適切なメソッド シグネチャを指定します。詳細については、「SqlDataSource コントロールにおけるパラメータの使用」および「ObjectDataSource コントロールにおけるパラメータの使用」を参照してください。

データ ソース コントロールには、一般に各データ操作に対してパラメータのコレクションがあります。データを選択するときは SelectParameters コレクションを指定し、データ項目を更新するときは UpdateParameters コレクションを指定します。特定のアクションのパラメータ コレクションの内容は、基になるデータ ソースに値を提供するために使用します。データを挿入、更新、または削除する場合、データ ソース コントロールは連結されたフィールドに対してパラメータを作成し、明示的に指定されたパラメータ コレクションがある場合はそれを組み合わせて、生成されたコレクションをデータ ソースに渡します。データ ソース コントロールが連結コントロールから取得したデータに基づいて作成するパラメータ名と値については、「データ ソース コントロールがデータ連結フィールドのパラメータを作成する方法」を参照してください。

QueryString フィールドの値に基づいて情報を取得する SqlDataSource コントロールのコード例を次に示します。

<asp:SqlDataSource id="Employees1" runat="server"
  ConnectionString="<%$ ConnectionStrings:Northwind %>"
  SelectCommand="SELECT EmployeeID, LastName, FirstName FROM Employees
                 WHERE EmployeeID = @empId">
  <SelectParameters>
    <asp:QueryStringParameter Name="empId" QueryStringField="empId" />
  </SelectParameters>
</asp:SqlDataSource>

ページの別のコントロールの値に基づいて情報を取得する SqlDataSource コントロールのコード例を次に示します。

<asp:DropDownList id="DropDownList1" runat="server" 
    autopostback="True">
  <asp:listitem selected>Sales Representative</asp:listitem>
  <asp:listitem>Sales Manager</asp:listitem>
  <asp:listitem>Vice President, Sales</asp:listitem>
</asp:DropDownList></p>

<asp:SqlDataSource id="Employees" runat="server"
  ConnectionString="<%$ ConnectionStrings:Northwind%>"
  SelectCommand="SELECT LastName FROM Employees WHERE Title = @Title">
  <SelectParameters>
    <asp:ControlParameter Name="Title" 
      ControlID="DropDownList1"
      PropertyName="SelectedValue"/>
  </SelectParameters>
</asp:sqldatasource>

QueryString フィールドの値に基づいて Where 句を作成する LinqDataSource コントロールのコード例を次に示します。

<asp:LinqDataSource 
      ContextTypeName="NorthwindDataContext" 
      TableName="Employees" 
      Where="EmployeeID = @empID" 
      ID="LinqDataSource1" 
      runat="server">
  <WhereParameters>
    <asp:QueryStringParameter Type="Int32" DefaultValue="1" 
        Name="empID" QueryStringField="empID" />
  </WhereParameters>
</asp:LinqDataSource>

ユーザーの選択内容に基づいて Order By 句を作成する LinqDataSource コントロールのコード例を次に示します。AutoGenerateOrderByClause プロパティが true に設定されています。このため、LinqDataSource コントロールは、OrderByParameters コレクション内のパラメータを使用して Order By 句を作成します。

<asp:DropDownList AutoPostBack="true" ID="DropDownList1" runat="server">
    <asp:ListItem Value="Category"></asp:ListItem>
    <asp:ListItem Value="Price"></asp:ListItem>
</asp:DropDownList>
<asp:LinqDataSource 
    ContextTypeName="ExampleDataContext" 
    TableName="Products" 
    AutoGenerateOrderByClause="true"
    ID="LinqDataSource1" 
    runat="server">
    <OrderByParameters>
      <asp:ControlParameter
         ControlID="DropDownList1" 
         Type="String" />
    </OrderByParameters>
</asp:LinqDataSource>

パラメータ化されたコマンドを使用してデータ連結コントロールから取得したデータにクエリを実行してデータを変更する SqlDataSource コントロールのコード例を次に示します。パラメータ値を厳密に型指定し、出力パラメータを指定するために、パラメータは明示的に指定されます。

<%@ Page language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

  Sub EmployeesDropDownList_OnSelectedIndexChanged(sender As Object, e As EventArgs)
    EmployeeDetailsView.DataBind()
  End Sub

  Sub EmployeeDetailsView_ItemUpdated(sender As Object, e As DetailsViewUpdatedEventArgs)
    EmployeesDropDownList.DataBind()
    EmployeesDropDownList.SelectedValue = e.Keys("EmployeeID").ToString()
    EmployeeDetailsView.DataBind()
  End Sub

  Sub EmployeeDetailsView_ItemDeleted(sender As Object, e As DetailsViewDeletedEventArgs)
    EmployeesDropDownList.DataBind()
  End Sub

  Sub EmployeeDetailsSqlDataSource_OnInserted(sender As Object, e As SqlDataSourceStatusEventArgs)
    Dim command As System.Data.Common.DbCommand = e.Command  
    EmployeesDropDownList.DataBind()
    EmployeesDropDownList.SelectedValue = _
      command.Parameters("@EmpID").Value.ToString()
    EmployeeDetailsView.DataBind()
  End Sub

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>Northwind Employees</title>
</head>
<body>
    <form id="form1" runat="server">

      <h3>Northwind Employees</h3>

        <table cellspacing="10">

          <tr>
            <td valign="top">
              <asp:DropDownList ID="EmployeesDropDownList" 
                DataSourceID="EmployeesSqlDataSource" 
                DataValueField="EmployeeID" 
                DataTextField="FullName"
                AutoPostBack="True"
                OnSelectedIndexChanged="EmployeesDropDownList_OnSelectedIndexChanged"
                RunAt="Server" />            
            </td>

            <td valign="top">                
              <asp:DetailsView ID="EmployeeDetailsView"
                DataSourceID="EmployeeDetailsSqlDataSource"
                AutoGenerateRows="false"
                AutoGenerateInsertbutton="true"
                AutoGenerateEditbutton="true"
                AutoGenerateDeletebutton="true"
                DataKeyNames="EmployeeID"     
                Gridlines="Both"
                OnItemUpdated="EmployeeDetailsView_ItemUpdated"
                OnItemDeleted="EmployeeDetailsView_ItemDeleted"      
                RunAt="server">

                <HeaderStyle backcolor="Navy"
                  forecolor="White"/>

                <RowStyle backcolor="White"/>

                <AlternatingRowStyle backcolor="LightGray"/>

                <EditRowStyle backcolor="LightCyan"/>

                <Fields>                  
                  <asp:BoundField DataField="EmployeeID" HeaderText="Employee ID" InsertVisible="False" ReadOnly="true"/>                    
                  <asp:BoundField DataField="FirstName"  HeaderText="First Name"/>
                  <asp:BoundField DataField="LastName"   HeaderText="Last Name"/>                    
                  <asp:BoundField DataField="Address"    HeaderText="Address"/>                    
                  <asp:BoundField DataField="City"       HeaderText="City"/>                        
                  <asp:BoundField DataField="Region"     HeaderText="Region"/>
                  <asp:BoundField DataField="PostalCode" HeaderText="Postal Code"/>                    
                </Fields>                    
              </asp:DetailsView>
            </td>                
          </tr>            
        </table>

        <asp:SqlDataSource ID="EmployeesSqlDataSource"  
          SelectCommand="SELECT EmployeeID, LastName + ', ' + FirstName AS FullName FROM Employees" 
          Connectionstring="<%$ ConnectionStrings:NorthwindConnection %>" 
          RunAt="server">
        </asp:SqlDataSource>


        <asp:SqlDataSource ID="EmployeeDetailsSqlDataSource" 
          SelectCommand="SELECT EmployeeID, LastName, FirstName, Address, City, Region, PostalCode
                         FROM Employees WHERE EmployeeID = @EmpID"

          InsertCommand="INSERT INTO Employees(LastName, FirstName, Address, City, Region, PostalCode)
                         VALUES (@LastName, @FirstName, @Address, @City, @Region, @PostalCode); 
                         SELECT @EmpID = SCOPE_IDENTITY()"

          UpdateCommand="UPDATE Employees SET LastName=@LastName, FirstName=@FirstName, Address=@Address,
                           City=@City, Region=@Region, PostalCode=@PostalCode
                         WHERE EmployeeID=@EmployeeID"

          DeleteCommand="DELETE Employees WHERE EmployeeID=@EmployeeID"

          ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
          OnInserted="EmployeeDetailsSqlDataSource_OnInserted"
          RunAt="server">

          <SelectParameters>
            <asp:ControlParameter ControlID="EmployeesDropDownList" PropertyName="SelectedValue"
                                  Name="EmpID" Type="Int32" DefaultValue="0" />
          </SelectParameters>

          <InsertParameters>
            <asp:Parameter Name="LastName"   Type="String" />
            <asp:Parameter Name="FirstName"  Type="String" />
            <asp:Parameter Name="Address"    Type="String" />
            <asp:Parameter Name="City"       Type="String" />
            <asp:Parameter Name="Region"     Type="String" />
            <asp:Parameter Name="PostalCode" Type="String" />
            <asp:Parameter Name="EmpID" Direction="Output" Type="Int32" DefaultValue="0" />
          </InsertParameters>

          <UpdateParameters>
            <asp:Parameter Name="LastName"   Type="String" />
            <asp:Parameter Name="FirstName"  Type="String" />
            <asp:Parameter Name="Address"    Type="String" />
            <asp:Parameter Name="City"       Type="String" />
            <asp:Parameter Name="Region"     Type="String" />
            <asp:Parameter Name="PostalCode" Type="String" />
            <asp:Parameter Name="EmployeeID" Type="Int32" DefaultValue="0" />
          </UpdateParameters>

          <DeleteParameters>
            <asp:Parameter Name="EmployeeID" Type="Int32" DefaultValue="0" />
          </DeleteParameters>

        </asp:SqlDataSource>
      </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">
<script runat="server">

  void EmployeesDropDownList_OnSelectedIndexChanged(Object sender, EventArgs e)
  {
    EmployeeDetailsView.DataBind();
  }

  void EmployeeDetailsView_ItemUpdated(Object sender, DetailsViewUpdatedEventArgs e)
  {
    EmployeesDropDownList.DataBind();
    EmployeesDropDownList.SelectedValue = e.Keys["EmployeeID"].ToString();
    EmployeeDetailsView.DataBind();
  }

  void EmployeeDetailsView_ItemDeleted(Object sender, DetailsViewDeletedEventArgs e)
  {
    EmployeesDropDownList.DataBind();
  }

  void EmployeeDetailsSqlDataSource_OnInserted(Object sender, SqlDataSourceStatusEventArgs e)
  {
    System.Data.Common.DbCommand command = e.Command;   
    EmployeesDropDownList.DataBind();
    EmployeesDropDownList.SelectedValue = 
      command.Parameters["@EmpID"].Value.ToString();
    EmployeeDetailsView.DataBind();
  }

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>Northwind Employees</title>
</head>
<body>
    <form id="form1" runat="server">

      <h3>Northwind Employees</h3>

        <table cellspacing="10">

          <tr>
            <td valign="top">
              <asp:DropDownList ID="EmployeesDropDownList" 
                DataSourceID="EmployeesSqlDataSource" 
                DataValueField="EmployeeID" 
                DataTextField="FullName"
                AutoPostBack="True"
                OnSelectedIndexChanged="EmployeesDropDownList_OnSelectedIndexChanged"
                RunAt="Server" />            
            </td>

            <td valign="top">                
              <asp:DetailsView ID="EmployeeDetailsView"
                DataSourceID="EmployeeDetailsSqlDataSource"
                AutoGenerateRows="false"
                AutoGenerateInsertbutton="true"
                AutoGenerateEditbutton="true"
                AutoGenerateDeletebutton="true"
                DataKeyNames="EmployeeID"     
                Gridlines="Both"
                OnItemUpdated="EmployeeDetailsView_ItemUpdated"
                OnItemDeleted="EmployeeDetailsView_ItemDeleted"      
                RunAt="server">

                <HeaderStyle backcolor="Navy"
                  forecolor="White"/>

                <RowStyle backcolor="White"/>

                <AlternatingRowStyle backcolor="LightGray"/>

                <EditRowStyle backcolor="LightCyan"/>

                <Fields>                  
                  <asp:BoundField DataField="EmployeeID" HeaderText="Employee ID" InsertVisible="False" ReadOnly="true"/>                    
                  <asp:BoundField DataField="FirstName"  HeaderText="First Name"/>
                  <asp:BoundField DataField="LastName"   HeaderText="Last Name"/>                    
                  <asp:BoundField DataField="Address"    HeaderText="Address"/>                    
                  <asp:BoundField DataField="City"       HeaderText="City"/>                        
                  <asp:BoundField DataField="Region"     HeaderText="Region"/>
                  <asp:BoundField DataField="PostalCode" HeaderText="Postal Code"/>                    
                </Fields>                    
              </asp:DetailsView>
            </td>                
          </tr>            
        </table>

        <asp:SqlDataSource ID="EmployeesSqlDataSource"  
          SelectCommand="SELECT EmployeeID, LastName + ', ' + FirstName AS FullName FROM Employees" 
          Connectionstring="<%$ ConnectionStrings:NorthwindConnection %>" 
          RunAt="server">
        </asp:SqlDataSource>


        <asp:SqlDataSource ID="EmployeeDetailsSqlDataSource" 
          SelectCommand="SELECT EmployeeID, LastName, FirstName, Address, City, Region, PostalCode
                         FROM Employees WHERE EmployeeID = @EmpID"

          InsertCommand="INSERT INTO Employees(LastName, FirstName, Address, City, Region, PostalCode)
                         VALUES (@LastName, @FirstName, @Address, @City, @Region, @PostalCode); 
                         SELECT @EmpID = SCOPE_IDENTITY()"

          UpdateCommand="UPDATE Employees SET LastName=@LastName, FirstName=@FirstName, Address=@Address,
                           City=@City, Region=@Region, PostalCode=@PostalCode
                         WHERE EmployeeID=@EmployeeID"

          DeleteCommand="DELETE Employees WHERE EmployeeID=@EmployeeID"

          ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
          OnInserted="EmployeeDetailsSqlDataSource_OnInserted"
          RunAt="server">

          <SelectParameters>
            <asp:ControlParameter ControlID="EmployeesDropDownList" PropertyName="SelectedValue"
                                  Name="EmpID" Type="Int32" DefaultValue="0" />
          </SelectParameters>

          <InsertParameters>
            <asp:Parameter Name="LastName"   Type="String" />
            <asp:Parameter Name="FirstName"  Type="String" />
            <asp:Parameter Name="Address"    Type="String" />
            <asp:Parameter Name="City"       Type="String" />
            <asp:Parameter Name="Region"     Type="String" />
            <asp:Parameter Name="PostalCode" Type="String" />
            <asp:Parameter Name="EmpID" Direction="Output" Type="Int32" DefaultValue="0" />
          </InsertParameters>

          <UpdateParameters>
            <asp:Parameter Name="LastName"   Type="String" />
            <asp:Parameter Name="FirstName"  Type="String" />
            <asp:Parameter Name="Address"    Type="String" />
            <asp:Parameter Name="City"       Type="String" />
            <asp:Parameter Name="Region"     Type="String" />
            <asp:Parameter Name="PostalCode" Type="String" />
            <asp:Parameter Name="EmployeeID" Type="Int32" DefaultValue="0" />
          </UpdateParameters>

          <DeleteParameters>
            <asp:Parameter Name="EmployeeID" Type="Int32" DefaultValue="0" />
          </DeleteParameters>

        </asp:SqlDataSource>
      </form>
  </body>
</html>

参照

処理手順

方法 : LinqDataSource コントロールを使用してデータを更新、挿入、および削除する

概念

SqlDataSource コントロールにおけるパラメータの使用

ObjectDataSource コントロールにおけるパラメータの使用

データ ソース コントロールがデータ連結フィールドのパラメータを作成する方法

データ ソース コントロールの概要

参照

Parameter