データソースコントロールデータバインドフィールドのパラメータの作成方法


データバインドコントロール(
GridView

DetailsView
または
FormView
コントロール)とASP.NETデータソースコントロールが共通に使用される場合、データバインドコントロールは、データバインドコントロールのバインドフィールドに基づいてデータソースコントロールにパラメータ名と値を渡すことができます.データ・ソース・コントロールには、選択または更新操作のためにパラメータ・セットにフィールド名と値が含まれます.詳細については、SqlDataSourceコントロールのパラメータの使用およびObjectDataSourceコントロールのパラメータの使用を参照してください.

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


データ・バインディング・コントロールがデータ・ソース・コントロールからアクションを要求すると、パラメータ名と値を含む1つ以上の
IDictionary
要求されたデータ操作で使用されるパラメータ名と値のセット.辞書の名前/値ペアの値は、サブコントロールから派生します.たとえば、更新操作では、データバインドコントロールが編集モードで表示される
TextBox
または
CheckBox
コントロールでパラメータ値を読み込みます.名前/値ペアの名前は、サブコントロールにバインドされているフィールド名と、DataKeyNameプロパティで指定されているフィールド名に由来します.更新または削除操作の場合、データバインドコントロールは、データレコードの元の値を含む辞書を渡すこともできます.
名前/値ペアを渡すには、次のIDictionaryコレクションを使用します.
  • Valuesの集合は、挿入操作の伝達である.新しいレコードを含む名前/値のペア.Valueコレクションのフィールド名と値は
    InsertItemTemplate
    のサブコントロール、またはDetailsViewコントロール(
    InsertVisible
    プロパティはtrue)のバインドフィールドに設定されます.
  • Keysコレクションは、オペレーションの更新および削除のために渡されます.更新または削除中のレコードを含むプライマリ・キーまたはキー.データ・ソースでキー・フィールドを変更できる場合、Keysセットにはキー・フィールドの元の値も含まれます.データ・ソース・コントロールのデータを使用してデータ・バインド・コントロールを埋め込む場合は、ビュー・ステータスでデータを維持します.更新または削除操作が要求されると、Keysコレクションは、以前のビュー状態に格納されていた値で埋め込まれます.データバインドコントロールの
    EnableViewState
    属性がfalseに設定されている場合、更新または削除操作にKeysコレクションは埋め込まれません.
  • NewValueコレクションは、更新操作のために渡されます.更新可能なキーフィールドの新しい値を含む、更新されたアイテムの新しい値を持つ名前/値のペアが含まれます.NewValueコレクションのフィールド名と値は、EditItemTemplateのサブコントロールまたはDetailsViewコントロールから取得されます.
    ReadOnly
    プロパティはfalse)のバインドフィールドに設定されます.
  • OldValueコレクションは、オペレーションの更新または削除のために渡されます.オープン・コンカレント・チェックに使用するデータ・レコードの元の値が含まれます.(オープンコンカレントチェックの詳細については、使用するデータソースコントロールのConflictDetectionプロパティを参照してください.)OldValueコレクションには、DataKeyNameプロパティによって識別されるキーフィールドの値は含まれません.キーフィールド名と値はKeysコレクションにのみ含まれます.データ・ソース・コントロールのデータを使用してデータ・バインド・コントロールを埋め込む場合は、ビュー・ステータスでデータを維持します.更新または削除操作を要求すると、以前にビュー状態に保存されていた値がOldValueコレクションに入力されます.データ・バインディング・コントロールのEnableView Stateプロパティがfalseに設定されている場合、OldValueコレクションは更新または削除操作には入力されません.

  • これらのセットには、データバインドコントロールイベントを使用して、要求された操作に渡されたパラメータにアクセスできます.例えばGridViewコントロールの
    RowUpdating
    イベントで、
    GridViewUpdateEventArgs
    クラス提供ペア
    NewValues
    集合のアクセス.

    パラメータ名


    データソースコントロールは、IDictionaryコレクションで渡された値のパラメータを自動的に作成します.挿入操作の場合、データ・ソース・コントロールは、Valueコレクション内の名前/値ペアの値を使用してInsertParametersコレクションに入力します.更新操作の場合、データ・ソース・コントロールは、Keys、NewValue、OldValueのセット内の名前/値のペアの値を使用して、UpdateParametersのセットに入力します.削除操作の場合、データ・ソース・コントロールは、KeysコレクションとOldValueコレクション内の名前/値ペアの値を使用してDeleteParametersコレクションに入力します.
    デフォルトでは、OldValueコレクションは入力されません.データソースコントロールのConflictDetectionプロパティのみが
    CompareAllValues
    に表示されます.
    更新または削除操作の場合、デフォルトでは、現在のバインド値のパラメータのみが作成されます.オープン・コンカレント・チェックをサポートする必要がある場合など、現在のバインド値と元のバインド値にアクセスする必要がある場合は、データ・ソース・コントロールに現在の値と元の値の両方にパラメータを作成できます.このためには、元の値を含むパラメータの命名規則を確立する必要があります.これらの元の値のパラメータのフォーマットは、OldValuesParameterFormatStringプロパティによって決定されます.OldValuesParameterFormatStringプロパティを文字列に設定します.この文字列に含まれる「{0}」は、フィールド名のプレースホルダです.たとえば、
    SqlDataSource
    コントロール、
    OldValuesParameterFormatString
    プロパティは「old_{0}」に設定され、元の値パラメータの名前は「@old_」に接頭辞として解析されます.のフィールド名(SqlDataSourceコントロールでは、すべてのパラメータ名の先頭に「@」文字を追加します.)LastModifiedDateという名前のフィールドの更新を検討します.このフィールドの現在の値はValues辞書に渡され、このフィールドの元の値はOldValues辞書に渡されます.このとき、現在の値を渡すための@LastModifiedDateというパラメータが作成され、元の値を渡すための@old_LastModifiedDateというパラメータが作成されます.その後、この2つのパラメータをSQL文に含めて、次の例のようにフィールドの現在の値と元の値を区別できます.
     
    UPDATE Table1 SET LastModifiedDate = @LastModifiedDate
    
                WHERE Key = @Key AND LastModifiedDate = @old_LastModifiedDate

    名前/値IDictionaryコレクションに直接アクセスする必要はありません.SQL文に自動生成されたパラメータ名(データ・ソースが命名パラメータをサポートしている場合)を簡単に含めるか、
    ObjectDataSource
    コントロールがアクセスするビジネス・オブジェクトのデータ・メソッドのパラメータ名.
    データソースコントロールを定義するUpdateParameters、InsertParameters、またはDeleteParametersのセットから
    Parameter
    オブジェクトを使用して、データバインドコントロールが渡す値をカスタマイズします.パラメータオブジェクトを作成して値を強くタイプ化するか、nullを渡すときにデフォルト値を指定できます.
    次のコード例では、SqlDataSourceコントロールにバインドされたDetailsViewコントロールを示します.SqlDataSourceコントロールの
    InsertCommand

    UpdateCommand
    および
    DeleteCommand
    属性SqlDataSourceコントロールを使用して自動的に生成されるパラメータ名.これらのパラメータ値は、KeysおよびNewValue辞書に従って入力されます.デフォルトでは
    ConflictDetection
    属性の設定
    OverWriteChanges
    ということでOldValues辞書は使いません.
    Visual Basic 
    <%@ Page language="VB" %>
    
                <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>
    
                <body>
    
                <form 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"
    
                Size="10"
    
                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>
    
                

    C# 
    <%@ Page language="C#" %>
    
                <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>
    
                <body>
    
                <form 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"
    
                Size="10"
    
                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>