데이터 소스 컨트롤에 매개 변수 사용

Visual Studio 2010

업데이트: 2007년 11월

ASP.NET 데이터 소스 컨트롤에서는 사용자가 런타임에 값을 전달할 수 있도록 입력 매개 변수를 허용합니다. 데이터 검색에 사용할 검색 기준을 제공하고 데이터 저장소에서 삽입, 업데이트 또는 삭제할 값을 제공하고 정렬, 페이징, 필터링을 수행할 값을 제공하기 위해 매개 변수를 사용할 수 있습니다. 매개 변수를 사용하면 사용자 지정 코드를 거의 작성하지 않고 데이터를 필터링하거나 마스터-세부 응용 프로그램을 만들 수 있습니다.

또한 매개 변수를 사용하면 GridViewFormView 같은 데이터 바인딩된 컨트롤이 자동 업데이트, 삽입 및 삭제 작업을 지원하는 데이터 소스에 전달하는 값을 사용자 지정할 수도 있습니다. 예를 들어 매개 변수 개체를 사용하여 값을 강력한 형식으로 설정하거나 데이터 소스에서 출력 값을 검색할 수 있습니다. 또한 매개 변수가 있는 쿼리를 사용하면 SQL 삽입 공격을 방지하여 응용 프로그램의 보안을 강화할 수 있습니다.

다양한 소스에서 매개 변수 값을 얻을 수 있습니다. Parameter 개체를 사용하면 웹 서버 컨트롤 속성, 쿠키, 세션 상태, QueryString 필드, 사용자 프로필 속성 및 다른 소스로부터 매개 변수가 있는 데이터 작업에 값을 제공할 수 있습니다.

웹 응용 프로그램에서 매개 변수 개체의 여러 가지 형식을 지정할 수 있습니다. 매개 변수 개체의 형식에 따라 매개 변수 값을 가져오는 소스가 달라집니다. Parameter 클래스는 모든 매개 변수 개체의 기본 클래스이며 모든 매개 변수 형식에 공통으로 사용되는 Name, Type, DirectionDefaultValue 속성을 포함합니다. 일반적으로 Parameter 기본 클래스를 사용하면 연결된 데이터 바인딩된 컨트롤에서 가져온 매개 변수 값(예: Update 또는 Delete 작업을 위해 GridView 컨트롤에서 전달된 값)을 데이터 소스에서 처리하는 방법을 지정할 수 있습니다.

다음 표의 내용과 같이 Parameter 클래스에서 파생되는 매개 변수 형식을 사용하여 다른 소스로부터 값을 얻을 수 있습니다.

매개 변수 형식

설명

ControlParameter

매개 변수를 ASP.NET 웹 페이지에 있는 Control의 속성 값으로 설정합니다. ControlID 속성을 사용하여 Control을 지정합니다. ControlParameter 개체의 PropertyName 속성을 사용하여 매개 변수 값을 제공하는 속성의 이름을 지정합니다.

Control에서 파생되는 일부 컨트롤은 컨트롤 값을 검색할 기본 속성을 결정하는 ControlValuePropertyAttribute를 정의합니다. PropertyName 속성이 명시적으로 설정되어 있지 않으면 항상 기본 속성이 사용됩니다. ControlValuePropertyAttribute는 다음 컨트롤 속성에 적용됩니다.

CookieParameter

매개 변수를 HttpCookie 개체의 값으로 설정합니다. CookieName 속성을 사용하여 HttpCookie 개체의 이름을 지정합니다. 지정된 HttpCookie 개체가 없으면 DefaultValue 속성의 값이 매개 변수 값으로 사용됩니다.

xt50s8kz.alert_note(ko-kr,VS.100).gif참고:
단일 값 쿠키만 지원됩니다.

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로 형식화됩니다. 매개 변수 값이 다른 형식(예: DateTime 또는 Int32)일 경우에는 Parameter 개체를 명시적으로 만들고 매개 변수의 Type 속성을 TypeCode 값으로 설정할 수 있습니다.

매개 변수 방향

기본적으로 매개 변수는 입력 매개 변수입니다. 저장 프로시저를 사용하는 경우처럼 특정한 경우에는 데이터 소스에서 반환된 값을 읽어야 할 수도 있습니다. 이런 경우 Parameter 개체의 Direction 속성을 설정하여 데이터 소스에서 웹 응용 프로그램에 반환하는 정보를 캡처해야 합니다. 지원되는 매개 변수 방향 설정은 Input, InputOutput, OutputReturnValue입니다. 일반적으로 데이터 작업이 완료된 후 매개 변수의 반환 값을 얻기 위해 Inserted 또는 Updated 이벤트 같은 데이터 소스 컨트롤 이벤트를 처리합니다.

데이터 소스 컨트롤은 여러 가지 방법을 사용하여 매개 변수가 있는 작업을 지원합니다. 예를 들어 LinqDataSource 컨트롤을 사용하면 런타임 값을 LINQ 쿼리의 절로 대체할 수 있습니다. SqlDataSourceAccessDataSource 컨트롤을 사용하면 SelectCommand 같은 SQL 문에서 매개 변수 자리 표시자를 지정할 수 있습니다. 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="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>


표시: