Share via


SqlDataSource 컨트롤에 매개 변수 사용

업데이트: 2007년 11월

SQL 문과 저장 프로시저에는 주로 런타임에 확인되는 매개 변수가 포함되어 있습니다. 매개 변수를 사용하여 작성된 SQL 문을 매개 변수가 있는 SQL 문이라고 합니다.

SqlDataSource 컨트롤을 사용하는 경우 매개 변수를 사용하는 SQL 쿼리와 문을 지정할 수 있습니다. 이렇게 하면 런타임에 확인되는 값에 따라 데이터베이스 정보를 읽고 작성하여 데이터 바인딩 시나리오에 융통성을 제공할 수 있습니다. ASP.NET 응용 프로그램 변수, 사용자 ID, 사용자가 선택한 값 등을 포함한 다양한 소스로부터 매개 변수 값을 가져올 수 있습니다. 매개 변수를 사용하면 데이터 검색을 위한 검색 조건과 데이터 저장소에서 삽입, 업데이트 또는 삭제할 값 및 정렬, 페이징, 필터링에 사용할 값 등을 제공할 수 있습니다.

매개 변수 사용

모든 데이터 소스 컨트롤과 마찬가지로 SqlDataSource 컨트롤은 런타임에 입력 매개 변수를 받고 매개 변수 컬렉션에서 이러한 매개 변수를 관리합니다. 각 데이터 작업에는 관련된 매개 변수 컬렉션이 있습니다. 예를 들어 선택 작업을 수행하는 경우 SelectParameters 컬렉션을 사용할 수 있으며 업데이트 작업을 수행할 경우에는 UpdateParameters 컬렉션을 사용할 수 있습니다.

각 매개 변수에 대해 이름, 형식, 방향 및 기본값을 지정할 수 있습니다. 컨트롤, 세션 변수 또는 사용자 프로필과 같은 특정 개체로부터 값을 가져오는 매개 변수를 사용하려면 추가 속성을 설정해야 합니다. 예를 들어 ControlParameter를 사용하려면 ControlID를 설정하여 매개 변수 값을 가져오는 컨트롤을 식별하고, PropertyName 속성을 설정하여 매개 변수 값이 포함된 속성을 지정해야 합니다. 자세한 내용은 데이터 소스 컨트롤에 매개 변수 사용을 참조하십시오.

또한 SqlDataSource 컨트롤은 자동 업데이트, 삽입 및 삭제 작업을 지원하는 데이터 바인딩된 컨트롤(예: GridView 또는 FormView 컨트롤)에 의해 전달된 값에 따라 자동으로 매개 변수를 만듭니다. 자세한 내용은 데이터 소스 컨트롤에서 데이터 바인딩된 필드에 대해 매개 변수가 생성되는 방식을 참조하십시오.

명령에 매개 변수 지정

SqlDataSource 컨트롤을 사용하는 경우 컨트롤의 명령 속성을 매개 변수가 있는 SQL 문 또는 저장 프로시저 이름으로 설정할 수 있습니다. 명령에 저장 프로시저를 지정하면 이 명령의 유형이 StoredProcedure임을 지정해야 합니다.

매개 변수 이름

SqlDataSource 컨트롤은 모든 매개 변수 이름 앞에 ParameterPrefix 속성의 값을 추가합니다. 기본 접두사는 "@"입니다.

GridView와 같은 데이터 바인딩된 컨트롤이 SqlDataSource 컨트롤에 바인딩되어 있는 경우, 데이터 바인딩된 컨트롤에서는 업데이트 또는 삭제 작업을 수행하는 동안 현재 레코드 값과 원래 레코드 값을 모두 SqlDataSource 컨트롤에 전달합니다. 현재 값은 Values 사전에 전달되고 원래 값은 Keys 또는 OldValues 사전에 전달됩니다. 이러한 사전의 내용은 지정된 데이터 작업을 위해 내부 DbCommand 개체의 Parameters 컬렉션에 추가됩니다.

SqlDataSource 컨트롤의 SQL 명령에 명명 규칙을 사용하여 매개 변수 자리 표시자를 명령에 전달된 이전 값과 일치시킵니다. SqlDataSource 컨트롤의 OldValuesParameterFormatString 속성을 설정하여 자리 표시자 이름의 형식을 구성합니다. "{0}"이(가) 필드 이름 자리 표시자로 포함된 문자열을 OldValuesParameterFormatString 속성에 설정합니다. 예를 들어 OldValuesParameterFormatString 속성을 "old_{0}"(으)로 설정하면 원래 값 매개 변수의 이름이 접두사 "@old_"를 사용하는 필드 이름으로 확인됩니다. LastModifiedDate 필드가 포함된 업데이트 작업을 가정해 봅니다. 필드의 현재 값은 Values 사전에 전달되고 필드의 원래 값은 OldValues 사전에 전달됩니다. 현재 값을 전달하기 위해 @LastModifiedDate라는 매개 변수가 만들어지고 원래 값을 전달하기 위해 @old\_LastModifiedDate라는 매개 변수가 만들어집니다. 그런 다음 아래 예제와 같이 필드의 현재 값과 원래 값을 구별하기 위해 SQL 문에 두 매개 변수를 모두 포함할 수 있습니다.

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

낙관적 동시성 검사를 수행하거나 기본 키를 수정할 수 있는 데이터 소스를 사용하여 작업하는 경우 명령에서 현재 값과 원래 값을 구분하는 기능이 중요합니다.

데이터 바인딩된 컨트롤에 의해 전달된 사전에 대한 자세한 내용은 데이터 소스 컨트롤에서 데이터 바인딩된 필드에 대해 매개 변수가 생성되는 방식을 참조하십시오.

SqlClient 공급자에 매개 변수 사용

기본적으로 SqlDataSource 컨트롤은 System.Data.SqlClient 데이터 공급자를 통해 SQL Server를 데이터 소스로 사용합니다. 다음 예제와 같이 System.Data.SqlClient 공급자는 명명된 매개 변수를 자리 표시자로 지원합니다.

SELECT * FROM Employees WHERE LastName = @LastName 
  AND FirstName = @FirstName

명명된 매개 변수를 사용하는 경우 명령에 대한 매개 변수 컬렉션에 지정된 매개 변수의 순서는 별로 중요하지 않습니다. 그러나 SQL 명령에 사용하는 매개 변수의 이름이 연결된 컬렉션에 있는 매개 변수의 이름과 일치하도록 해야 합니다.

다음 예제에서는 System.Data.SqlClient 공급자를 사용하는 SqlDataSource 컨트롤에 대한 SQL 명령에 명명된 매개 변수를 사용하는 방법을 보여 줍니다.

<asp:sqlDataSource ID="EmployeeDetailsSqlDataSource" 
  SelectCommand="SELECT EmployeeID, LastName, FirstName FROM Employees WHERE EmployeeID = @EmpID"

  InsertCommand="INSERT INTO Employees(LastName, FirstName) VALUES (@LastName, @FirstName); 
                 SELECT @EmpID = SCOPE_IDENTITY()"
  UpdateCommand="UPDATE Employees SET LastName=@LastName, FirstName=@FirstName 
                   WHERE EmployeeID=@EmployeeID"
  DeleteCommand="DELETE Employees WHERE EmployeeID=@EmployeeID"

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

  <SelectParameters>
    <asp:Parameter Name="EmpID" Type="Int32" DefaultValue="0" />
  </SelectParameters>

  <InsertParameters>
    <asp:Parameter Name="EmpID" Direction="Output" Type="Int32" DefaultValue="0" />
  </InsertParameters>

</asp:sqlDataSource>
<asp:sqlDataSource ID="EmployeeDetailsSqlDataSource" 
  SelectCommand="SELECT EmployeeID, LastName, FirstName FROM Employees WHERE EmployeeID = @EmpID"

  InsertCommand="INSERT INTO Employees(LastName, FirstName) VALUES (@LastName, @FirstName); 
                 SELECT @EmpID = SCOPE_IDENTITY()"
  UpdateCommand="UPDATE Employees SET LastName=@LastName, FirstName=@FirstName 
                   WHERE EmployeeID=@EmployeeID"
  DeleteCommand="DELETE Employees WHERE EmployeeID=@EmployeeID"

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

  <SelectParameters>
    <asp:Parameter Name="EmpID" Type="Int32" DefaultValue="0" />
  </SelectParameters>

  <InsertParameters>
    <asp:Parameter Name="EmpID" Direction="Output" Type="Int32" DefaultValue="0" />
  </InsertParameters>

</asp:sqlDataSource>

OleDb 및 Odbc 공급자에 매개 변수 사용

OLE DB 또는 ODBC 데이터 소스에 연결 중인 경우 System.Data.OleDb 또는 System.Data.Odbc 공급자를 각 데이터 소스와 함께 사용하도록 SqlDataSource 컨트롤을 구성할 수 있습니다. System.Data.OleDbSystem.Data.Odbc 공급자는 다음 예제와 같이 "?" 문자로 식별되는 위치 매개 변수만 지원합니다.

SELECT * FROM Employees WHERE LastName = ? AND FirstName = ?

매개 변수가 있는 SQL 문에 System.Data.OleDbSystem.Data.Odbc 공급자를 사용하는 경우 매개 변수 자리 표시자를 지정하는 순서는 관련된 매개 변수 컬렉션에서 매개 변수의 순서와 일치해야 합니다. 관련된 UpdateCommandUpdateParameters 컬렉션과 같이 관련된 데이터 작업의 컬렉션에 매개 변수를 명시적으로 지정하여 각 매개 변수의 순서를 제어할 수 있습니다. 데이터 바인딩된 컨트롤에 의해 전달되는 값에서 자동으로 만들어지는 매개 변수에 대한 매개 변수 컬렉션을 명시적으로 만들 경우 명시적으로 만들어진 매개 변수는 자동으로 생성되는 매개 변수를 덮어씁니다. 이런 방법을 통해 원하는 순서대로 매개 변수를 전달할 수 있습니다. 값을 반환하는 저장 프로시저를 호출하는 경우에는 ReturnValueDirection 값을 명령 매개 변수 컬렉션의 첫 번째 매개 변수로 사용하여 매개 변수를 지정해야 합니다.

참고:

기본적으로 데이터 바인딩된 컨트롤의 바인딩된 필드를 기반으로 하는 매개 변수는 매개 변수 사전에서 명령에 추가될 때 Values, Keys, OldValues 순서로 추가됩니다. 삭제 작업의 경우 Keys 사전만 사용되고 삽입 작업의 경우 Values 사전만 사용됩니다. 데이터 바인딩된 컨트롤에 의해 전달된 사전에 대한 자세한 내용은 데이터 소스 컨트롤에서 데이터 바인딩된 필드에 대해 매개 변수가 생성되는 방식을 참조하십시오.

다음 예제에서는 System.Data.OleDb 공급자를 사용하는 SqlDataSource 컨트롤에 대한 매개 변수를 지정하는 방법을 보여 줍니다. 컬렉션의 매개 변수 순서가 SQL 문의 자리 표시자 순서와 일치하도록 하기 위해 매개 변수가 명시적으로 지정됩니다.

<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:TemplateField HeaderText="Birth Date">
    <ItemTemplate> 
      <asp:Label ID="BirthDateLabel" Runat="Server" 
                 Text='<%# Eval("BirthDate", "{0:d}") %>' />
    </ItemTemplate>
    <InsertItemTemplate>
      <asp:Calendar ID="InsertBirthDateCalendar" Runat="Server"
                    SelectedDate='<%# Bind("BirthDate") %>' />
    </InsertItemTemplate>
    <EditItemTemplate>
      <asp:Calendar ID="EditBirthDateCalendar" Runat="Server"
                    VisibleDate='<%# Eval("BirthDate") %>'
                    SelectedDate='<%# Bind("BirthDate") %>' />
    </EditItemTemplate>
  </asp:TemplateField>                    
</Fields> 
<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:TemplateField HeaderText="Birth Date">
    <ItemTemplate> 
      <asp:Label ID="BirthDateLabel" Runat="Server" 
                 Text='<%# Eval("BirthDate", "{0:d}") %>' />
    </ItemTemplate>
    <InsertItemTemplate>
      <asp:Calendar ID="InsertBirthDateCalendar" Runat="Server"
                    SelectedDate='<%# Bind("BirthDate") %>' />
    </InsertItemTemplate>
    <EditItemTemplate>
      <asp:Calendar ID="EditBirthDateCalendar" Runat="Server"
                    VisibleDate='<%# Eval("BirthDate") %>'
                    SelectedDate='<%# Bind("BirthDate") %>' />
    </EditItemTemplate>
  </asp:TemplateField>                    
</Fields> 

참고 항목

개념

SqlDataSource 컨트롤을 사용하여 데이터 선택

SqlDataSource 컨트롤을 사용하여 데이터 수정

참조

SqlDataSource

AccessDataSource