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

更新 : 2007 年 11 月

ASP.NET データ ソース コントロールと共に GridViewDetailsViewFormView などのデータ連結コントロールを使用する場合、データ連結コントロールは連結フィールドに基づいてパラメータ名と値をデータ ソース コントロールに渡すことができます。次に、データ ソース コントロールは、選択操作または更新操作のパラメータのコレクションにフィールド名と値を含めます。詳細については、「SqlDataSource コントロールにおけるパラメータの使用」および「ObjectDataSource コントロールにおけるパラメータの使用」を参照してください。

データ ソース コントロールに渡される辞書

データ連結コントロールがデータ ソース コントロールから操作を要求するときは、要求されたデータ操作のためのパラメータ名と値を含む 1 つ以上の IDictionary コレクションを渡します。辞書の名前/値のペアの値は、子コントロールから派生します。たとえば、更新操作では、データ連結コントロールは編集モードで表示される TextBox コントロールまたは CheckBox コントロールからパラメータ値を読み取ります。名前/値のペアの名前は子コントロールに連結されるフィールドの名前、および DataKeyNames プロパティで指定されるフィールド名から取得されます。更新操作または削除操作では、データ連結コントロールはデータ レコードの元の値を含む辞書を渡すこともあります。

名前/値のペアは、次の IDictionary コレクションを使用して渡されます。

  • Values コレクション   挿入操作のために渡されます。新しいレコードの名前/値のペアが含まれます。Values コレクションのフィールド名と値は InsertItemTemplate の子コントロール、または InsertVisible プロパティが true に設定されている DetailsView コントロールの連結フィールドから取得されます。

  • Keys コレクション   更新操作と削除操作のために渡されます。更新または削除されるレコードの主キーが含まれます。データ ソースでキー フィールドが変更できる場合、Keys コレクションにはキー フィールドの元の値も含まれます。データ ソース コントロールからデータ連結コントロールに設定されたデータはビューステートに格納されます。更新操作または削除操作が要求されると、前にビューステートに格納されていた値が Keys コレクションに設定されます。データ連結コントロールの EnableViewState プロパティを false に設定すると、更新操作または削除操作で Keys コレクションにデータは設定されません。

  • NewValues コレクション   更新操作のために渡されます。更新可能なキー フィールドの新しい値と共に更新された項目の新しい値および名前/値のペアが含まれます。NewValues コレクションのフィールド名と値は EditItemTemplate の子コントロール、または ReadOnly プロパティが false に設定されている DetailsView コントロールの連結フィールドから取得されます。

  • OldValues コレクション   更新操作または削除操作のために渡されます。オプティミスティック同時実行制御の照合に使用するデータ レコードの元の値が含まれます。オプティミスティック同時実行制御の照合については、使用しているデータ ソース コントロールの ConflictDetection プロパティを参照してください。DataKeyNames プロパティによって識別されるキー フィールドの値は、OldValues コレクションに含まれません。キー フィールド名と値は、Keys コレクションのみに含まれます。データ ソース コントロールからデータ連結コントロールに設定されたデータはビューステートに格納されます。更新操作または削除操作が要求されると、前にビューステートに格納されていた値が OldValues コレクションに設定されます。データ連結コントロールの EnableViewState プロパティを false に設定すると、更新操作または削除操作で OldValues コレクションにデータは設定されません。

以上のすべてのコレクションには、要求された操作のデータ連結コントロール イベントで渡される引数を使用してアクセスできます。たとえば、GridView コントロールの RowUpdating イベントでは、GridViewUpdateEventArgs クラスを使用して NewValues コレクションにアクセスできます。

パラメータ名

データ ソース コントロールは、IDictionary コレクションで渡される値のパラメータを自動的に作成します。挿入操作では、データ ソース コントロールは Values コレクションの名前/値のペアの値を InsertParameters コレクションに設定します。更新操作では、データ ソース コントロールは Keys、NewValues、および OldValues の各コレクションの名前/値のペアの値を UpdateParameters コレクションに設定します。削除操作では、データ ソース コントロールは Keys コレクションと OldValues コレクションの名前/値のペアの値を DeleteParameters コレクションに設定します。

既定では、OldValues コレクションに値は設定されません。これには、データ ソース コントロールの ConflictDetection プロパティが CompareAllValues に設定されている場合のみ値が設定されます。

更新操作または削除操作については、既定では、現在バインドされている値のパラメータだけが作成されます。オプティミスティック同時実行制御のチェックをサポートする場合などのように、現在バインドされている値と元のバインドされた値の両方にアクセスする必要がある場合は、データ ソース コントロールで現在の値と元の値の両方に対してパラメータを作成できます。これを行うには、元の値を含むパラメータの名前付け規則を確立する必要があります。元の値のパラメータの形式は、OldValuesParameterFormatString プロパティによって決定されます。フィールド名のプレースホルダとして、OldValuesParameterFormatString プロパティに "{0}" を含む文字列を設定します。たとえば、SqlDataSource コントロールの使用時に OldValuesParameterFormatString プロパティを "old_{0}" に設定すると、元の値のパラメータの名前はフィールド名に "@old_" というプリフィックスが付けられた名前に解決されます (SqlDataSource コントロールは、すべてのパラメータ名の先頭に "@" という文字を追加します)。たとえば、LastModifiedDate という名前のフィールドを含む更新操作を実行するとします。フィールドの現在の値は Values 辞書に渡され、フィールドの元の値は OldValues 辞書に渡されます。現在の値を渡すために @LastModifiedDate というパラメータが作成され、元の値を渡すために @old\_LastModifiedDate というパラメータが作成されます。その後に、次の例に示すように、両方のパラメータを SQL ステートメントに含めてフィールドの現在の値と元の値を区別します。

UPDATE Table1 SET LastModifiedDate = @LastModifiedDate
  WHERE Key = @Key AND LastModifiedDate = @old_LastModifiedDate

名前/値の IDictionary コレクションに直接アクセスする必要はありません。データ ソースが名前付きパラメータをサポートする場合は SQL ステートメントに自動的に生成されたパラメータ名を含めるか、または ObjectDataSource コントロールを使用してアクセスしているビジネス オブジェクトのデータ メソッドのパラメータ名として含めるだけです。

データ ソース コントロールの UpdateParameters、InsertParameters、または DeleteParameters の各コレクションで、データ連結コントロールから渡される値をカスタマイズするために Parameter オブジェクトを定義することもできます。値を厳密に型指定するため、または null が渡された場合の既定値を指定するために Parameter オブジェクトを作成することもできます。

SqlDataSource コントロールに連結された DetailsView コントロールのコード例を次に示します。SqlDataSource コントロールの InsertCommandUpdateCommand、および DeleteCommand の各プロパティは、SqlDataSource コントロールによって自動的に生成されるパラメータ名を使用します。パラメータには、Keys 辞書と NewValues 辞書に基づいて値が設定されます。ConflictDetection プロパティが既定値の ConflictOptions.OverwriteChanges に設定されているため、OldValues 辞書は使用されません。

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

参照

概念

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

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

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

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