데이터 소스 컨트롤에서 데이터 바인딩된 필드에 대해 매개 변수가 생성되는 방식

Visual Studio 2010

업데이트: 2007년 11월

ASP.NET 데이터 소스 컨트롤에 GridView, DetailsView 또는 FormView 같은 데이터 바인딩된 컨트롤을 사용하는 경우 이러한 데이터 바인딩된 컨트롤에서는 데이터 바인딩된 컨트롤의 바인딩된 필드를 기반으로 데이터 소스 컨트롤에 매개 변수 이름과 값을 전달할 수 있습니다. 그러면 데이터 소스 컨트롤에는 선택 또는 업데이트 작업에 대한 매개 변수 컬렉션에 필드 이름과 값이 포함됩니다. 자세한 내용은 SqlDataSource 컨트롤에 매개 변수 사용ObjectDataSource 컨트롤에 매개 변수 사용을 참조하십시오.

데이터 바인딩된 컨트롤에서 데이터 소스 컨트롤에 작업을 요청할 경우에는 요청한 데이터 작업에 대한 매개 변수 이름과 값이 포함된 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, NewValuesOldValues 컬렉션의 이름/값 쌍에 대한 값으로 UpdateParameters 컬렉션을 채웁니다. 또한 삭제 작업을 수행할 경우에는 KeysOldValues 컬렉션의 이름/값 쌍에 대한 값으로 DeleteParameters 컬렉션을 채웁니다.

기본적으로 OldValues 컬렉션은 채워지지 않습니다. 이 컬렉션은 데이터 소스 컨트롤의 ConflictDetection 속성이 CompareAllValues로 설정되어 있는 경우에만 채워집니다.

업데이트 또는 삭제 작업의 경우 기본적으로 현재 바인딩된 값의 매개 변수만 생성됩니다. 낙관성 동시성 검사를 지원해야 하는 경우와 같이 현재 바인딩된 값과 원래 바인딩된 값을 모두 액세스해야 하는 경우 데이터 소스 컨트롤이 현재 값과 원래 값에 대한 매개 변수를 모두 만들도록 설정할 수 있습니다. 이렇게 하려면 원래 값이 포함될 매개 변수에 대한 명명 규칙을 지정해야 합니다. 원래 값의 매개 변수 형식은 OldValuesParameterFormatString 속성에 따라 결정됩니다. "{0}"이(가) 필드 이름 자리 표시자로 포함된 문자열을 OldValuesParameterFormatString 속성에 설정합니다. 예를 들어 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 컨트롤의 InsertCommand, UpdateCommandDeleteCommand 속성은 SqlDataSource 컨트롤에서 자동으로 생성된 매개 변수 이름을 사용합니다. 매개 변수 값은 KeysNewValues 사전을 기반으로 채워집니다. ConflictDetection 속성이 ConflictOptions.OverwriteChanges(기본값)로 설정되어 있으므로 OldValues 사전은 사용되지 않습니다.

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


표시: