SqlDataSource와 함께 매개 변수가 있는 쿼리 사용(C#)Using Parameterized Queries with the SqlDataSource (C#)

Scott Mitchellby Scott Mitchell

샘플 앱 다운로드 또는 PDF 다운로드Download Sample App or Download PDF

이 자습서에서는 SqlDataSource 컨트롤을 계속 살펴보고 매개 변수가 있는 쿼리를 정의 하는 방법을 알아봅니다.In this tutorial, we continue our look at the SqlDataSource control and learn how to define parameterized queries. 매개 변수는 선언적으로 프로그래밍 방식으로 지정할 수 있으며 querystring, 세션 상태, 다른 컨트롤 등의 여러 위치에서 끌어올 수 있습니다.The parameters can be specified both declaratively and programmatically, and can be pulled from a number of locations such as the querystring, Session state, other controls, and more.

소개Introduction

이전 자습서에서는 SqlDataSource 컨트롤을 사용 하 여 데이터베이스에서 직접 데이터를 검색 하는 방법을 살펴보았습니다.In the previous tutorial we saw how to use the SqlDataSource control to retrieve data directly from a database. 데이터 원본 구성 마법사를 사용 하 여 데이터베이스를 선택한 다음 테이블 또는 뷰에서 반환할 열을 선택 합니다. 사용자 지정 SQL 문을 입력 합니다. 또는 저장 프로시저를 사용 합니다.Using the Configure Data Source wizard, we could choose the database and then either: pick the columns to return from a table or view; enter a custom SQL statement; or use a stored procedure. 테이블이 나 뷰에서 열을 선택 하거나 사용자 지정 SQL 문을 입력 하는 경우에는 SqlDataSource 컨트롤 s SelectCommand 속성에 결과 임시 SQL SELECT 문이 할당 됩니다 .이 SELECT은 SqlDataSource s Select() 메서드가 호출 될 때 (프로그래밍 방식으로 또는 데이터 웹 컨트롤에서 자동으로) 실행 되는 문입니다.Whether selecting columns from a table or view or entering a custom SQL statement, the SqlDataSource control s SelectCommand property is assigned the resulting ad-hoc SQL SELECT statement and it is this SELECT statement that is executed when the SqlDataSource s Select() method is invoked (either programmatically or automatically from a data Web control).

이전 자습서 s에서 사용 되는 SQL SELECT 문에는 WHERE 절이 없습니다.The SQL SELECT statements used in the previous tutorial s demos lacked WHERE clauses. SELECT 문에서 WHERE 절을 사용 하 여 반환 되는 결과를 제한할 수 있습니다.In a SELECT statement, the WHERE clause can be used to limit the results returned. 예를 들어 제품의 이름을 $50.00 이상으로 표시 하려면 다음 쿼리를 사용할 수 있습니다.For example, to display the names of products costing more than $50.00, we could use the following query:

SELECT ProductName
FROM Products
WHERE UnitPrice > 50.00

일반적으로 WHERE 절에 사용 되는 값은 querystring 값, 세션 변수, 페이지의 웹 컨트롤에 있는 사용자 입력 등의 외부 소스에 의해 결정 됩니다.Typically, the values used in a WHERE clause are determine by some external source, such as a querystring value, a session variable, or user input from a Web control on the page. 이러한 입력은 매개 변수를 사용 하 여 지정 하는 것이 가장 좋습니다.Ideally, such inputs are specified through the use of parameters. Microsoft SQL Server에서 매개 변수는 다음과 같이 @parameterName를 사용 하 여 표시 됩니다.With Microsoft SQL Server, parameters are denoted using @parameterName, as in:

SELECT ProductName
FROM Products
WHERE UnitPrice > @Price

SqlDataSource는 SELECT 문과 INSERT, UPDATEDELETE 문에 대해 매개 변수가 있는 쿼리를 지원 합니다.The SqlDataSource supports parameterized queries, both for SELECT statements and INSERT, UPDATE, and DELETE statements. 또한 매개 변수 값은 querystring, 세션 상태, 페이지의 컨트롤 등 다양 한 원본에서 자동으로 끌어올 수 있으며 프로그래밍 방식으로 할당 될 수도 있습니다.Moreover, the parameter values can be automatically pulled from a variety of sources the querystring, session state, controls on the page, and so on or can be assigned programmatically. 이 자습서에서는 매개 변수가 있는 쿼리를 정의 하는 방법 뿐만 아니라 선언적으로 프로그래밍 방식으로 매개 변수 값을 지정 하는 방법에 대해 알아봅니다.In this tutorial, we'll see how to define parameterized queries as well as how to specify the parameter values both declaratively and programmatically.

Note

이전 자습서에서는 SqlDataSource와 함께 첫 번째 46 자습서를 선택 하 여 개념적 유사성을 나타내는 ObjectDataSource를 비교 했습니다.In the previous tutorial we compared the ObjectDataSource which has been our tool of choice over the first 46 tutorials with the SqlDataSource, noting their conceptual similarities. 이러한 유사성도 매개 변수로 확장 됩니다.These similarities also extend to parameters. 비즈니스 논리 계층의 메서드에 대 한 입력 매개 변수에 매핑된 ObjectDataSource s 매개 변수입니다.The ObjectDataSource s parameters mapped to the input parameters for the methods in the Business Logic Layer. SqlDataSource를 사용 하 여 매개 변수는 SQL 쿼리 내에서 직접 정의 됩니다.With the SqlDataSource, the parameters are defined directly within the SQL query. 두 컨트롤 모두 Select(), Insert(), Update()Delete() 메서드에 대 한 매개 변수 컬렉션을 포함 하며, 두 컨트롤 모두 미리 정의 된 원본 (querystring 값, 세션 변수 등)에서 채우거 나 프로그래밍 방식으로 할당 된 이러한 매개 변수 값을 가질 수 있습니다.Both controls have collections of parameters for their Select(), Insert(), Update(), and Delete() methods, and both can have these parameter values populated from pre-defined sources (querystring values, session variables, and so on) or assigned programmatically.

매개 변수가 있는 쿼리 만들기Creating a Parameterized Query

SqlDataSource 컨트롤 s 데이터 원본 구성 마법사는 데이터베이스 레코드를 검색 하기 위해 실행할 명령을 정의 하는 세 가지 방법을 제공 합니다.The SqlDataSource control s Configure Data Source wizard offers three avenues for defining the command to execute to retrieve database records:

  • 기존 테이블 또는 뷰에서 열을 선택 하 여By picking the columns from an existing table or view,
  • 사용자 지정 SQL 문을 입력 하 여 또는By entering a custom SQL statement, or
  • 저장 프로시저 선택By choosing a stored procedure

기존 테이블이 나 뷰에서 열을 선택 하는 경우 WHERE 절 추가 대화 상자를 통해 WHERE 절의 매개 변수를 지정 해야 합니다.When picking columns from an existing table or view, the parameters for the WHERE clause must be specified through the Add WHERE Clause dialog box. 그러나 사용자 지정 SQL 문을 만들 때 @parameterName를 사용 하 여 각 매개 변수를 나타내는 매개 변수를 WHERE 절에 직접 입력할 수 있습니다.When creating a custom SQL statement, however, you can enter the parameters directly into the WHERE clause (using @parameterName to denote each parameter). 저장 프로시저 는 하나 이상의 SQL 문으로 구성 되며 이러한 문은 매개 변수화 할 수 있습니다.A stored procedure consists of one or more SQL statements, and these statements can be parameterized. 그러나 SQL 문에 사용 되는 매개 변수는 저장 프로시저에 입력 매개 변수로 전달 되어야 합니다.The parameters used in the SQL statements, however, must be passed in as input parameters to the stored procedure.

매개 변수가 있는 쿼리를 만드는 것은 SqlDataSource s SelectCommand 지정 하는 방법에 따라 달라 지므로,는 세 가지 방법을 모두 살펴보겠습니다.Since creating a parameterized query depends on how the SqlDataSource s SelectCommand is specified, let s take a look at all three approaches. 시작 하려면 SqlDataSource 폴더에서 ParameterizedQueries.aspx 페이지를 열고 SqlDataSource 컨트롤을 도구 상자에서 디자이너로 끌고 IDProducts25BucksAndUnderDataSource로 설정 합니다.To get started, open the ParameterizedQueries.aspx page in the SqlDataSource folder, drag a SqlDataSource control from the Toolbox onto the Designer, and set its ID to Products25BucksAndUnderDataSource. 그런 다음 컨트롤의 스마트 태그에서 데이터 소스 구성 링크를 클릭 합니다.Next, click the Configure Data Source link from the control s smart tag. 사용할 데이터베이스 (NORTHWINDConnectionString)를 선택 하 고 다음을 클릭 합니다.Select the database to use (NORTHWINDConnectionString) and click Next.

1 단계: 테이블이 나 뷰에서 열을 선택할 때WHERE절 추가Step 1: Adding aWHEREClause When Picking the Columns from a Table or View

SqlDataSource 컨트롤을 사용 하 여 데이터베이스에서 반환할 데이터를 선택 하는 경우 데이터 원본 구성 마법사를 사용 하 여 기존 테이블 또는 뷰에서 반환할 열을 선택할 수 있습니다 (그림 1 참조).When selecting the data to return from the database with the SqlDataSource control, the Configure Data Source wizard allows us to simply pick the columns to return from an existing table or view (see Figure 1). 이렇게 하면 SqlDataSource s Select() 메서드가 호출 될 때 데이터베이스에 전송 되는 SQL SELECT 문이 자동으로 빌드됩니다.Doing so automatically builds up a SQL SELECT statement, which is what is sent to the database when the SqlDataSource s Select() method is invoked. 이전 자습서에서와 같이 드롭다운 목록에서 Products 테이블을 선택 하 고 ProductID, ProductNameUnitPrice 열을 확인 합니다.As we did in the previous tutorial, select the Products table from the drop-down list and check the ProductID, ProductName, and UnitPrice columns.

테이블이 나 뷰에서 반환할 열을 선택 Pick the Columns to Return from a Table or View

그림 1: 테이블 또는 뷰에서 반환할 열 선택 (전체 크기 이미지를 보려면 클릭)Figure 1: Pick the Columns to Return from a Table or View (Click to view full-size image)

SELECT 문에 WHERE 절을 포함 하려면 WHERE 절 추가 대화 상자를 표시 하는 WHERE 단추를 클릭 합니다 (그림 2 참조).To include a WHERE clause in the SELECT statement, click the WHERE button, which brings up the Add WHERE Clause dialog box (see Figure 2). SELECT 쿼리에서 반환 되는 결과를 제한 하는 매개 변수를 추가 하려면 먼저 열을 선택 하 여 데이터를 필터링 합니다.To add a parameter to limit the results returned by the SELECT query, first choose the column to filter the data by. 그런 다음 필터링에 사용할 연산자 (=, <, <=, >등)를 선택 합니다.Next, choose the operator to use for filtering (=, <, <=, >, and so on). 마지막으로 querystring 또는 session 상태에서와 같이 매개 변수 값의 원본을 선택 합니다.Finally, choose the source of the parameter s value, such as from the querystring or session state. 매개 변수를 구성한 후 추가 단추를 클릭 하 여 SELECT 쿼리에 포함 합니다.After configuring the parameter, click the Add button to include it in the SELECT query.

이 예에서는 UnitPrice 값이 $25.00 보다 작거나 같은 결과만 반환 합니다.For this example, let s only return those results where the UnitPrice value is less than or equal to $25.00. 따라서 열 드롭다운 목록에서 UnitPrice을 선택 하 고 연산자 드롭다운 목록에서 <=를 선택 합니다.Therefore, pick UnitPrice from the Column drop-down list and <= from the Operator drop-down list. 하드 코드 된 매개 변수 값 (예: $25.00)을 사용 하거나 매개 변수 값을 프로그래밍 방식으로 지정 하는 경우 원본 드롭다운 목록에서 없음을 선택 합니다.When using a hard-coded parameter value (such as $25.00) or if the parameter value is to be specified programmatically, select None from the Source drop-down list. 그런 다음 값 텍스트 상자 25.00에 하드 코드 된 매개 변수 값을 입력 하 고 추가 단추를 클릭 하 여 프로세스를 완료 합니다.Next, enter the hard-coded parameter value in the Value textbox 25.00 and complete the process by clicking the Add button.

WHERE 절 추가 대화 상자에서 반환 된 결과를 제한 Limit the Results Returned from the Add WHERE Clause Dialog Box

그림 2: WHERE 절 추가 대화 상자에서 반환 된 결과 제한 (전체 크기 이미지를 보려면 클릭)Figure 2: Limit the Results Returned from the Add WHERE Clause Dialog Box (Click to view full-size image)

매개 변수를 추가한 후 확인을 클릭 하 여 데이터 원본 구성 마법사로 돌아갑니다.After adding the parameter, click OK to return to the Configure Data Source wizard. 이제 마법사 아래쪽의 SELECT 문에 @UnitPrice라는 매개 변수가 있는 WHERE 절이 포함 됩니다.The SELECT statement at the bottom of the wizard should now include a WHERE clause with a parameter named @UnitPrice:

SELECT [ProductID], [ProductName], [UnitPrice]
FROM [Products]
WHERE ([UnitPrice] <= @UnitPrice)

Note

WHERE 절 추가 대화 상자에서 WHERE 절에 여러 조건을 지정 하는 경우 마법사는이를 AND 연산자와 조인 합니다.If you specify multiple conditions in the WHERE clause from the Add WHERE Clause dialog box, the wizard joins them with the AND operator. WHERE 절에 OR를 포함 해야 하는 경우 (예: WHERE UnitPrice <= @UnitPrice OR Discontinued = 1) 사용자 지정 SQL 문 화면을 통해 SELECT 문을 빌드해야 합니다.If you need to include an OR in the WHERE clause (such as WHERE UnitPrice <= @UnitPrice OR Discontinued = 1) then you have to build the SELECT statement through the custom SQL statement screen.

SqlDataSource 구성 (다음, 마침을 차례로 클릭)을 완료 한 다음 SqlDataSource의 선언적 태그를 검사 합니다.Complete configuring the SqlDataSource (click Next, then Finish) and then inspect the SqlDataSource s declarative markup. 태그에는 이제 SelectCommand의 매개 변수에 대 한 소스를 출력 하는 <SelectParameters> 컬렉션이 포함 되어 있습니다.The markup now includes a <SelectParameters> collection, which spells out the sources for the parameters in the SelectCommand.

<asp:SqlDataSource ID="Products25BucksAndUnderDataSource" runat="server"
    ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
    SelectCommand=
        "SELECT [ProductID], [ProductName], [UnitPrice]
        FROM [Products] WHERE ([UnitPrice] <= @UnitPrice)">
    <SelectParameters>
        <asp:Parameter DefaultValue="25.00" Name="UnitPrice" Type="Decimal" />
    </SelectParameters>
</asp:SqlDataSource>

SqlDataSource s Select() 메서드를 호출 하면 UnitPrice 매개 변수 값 (25.00)이 데이터베이스로 전송 되기 전에 SelectCommand@UnitPrice 매개 변수에 적용 됩니다.When the SqlDataSource s Select() method is invoked, the UnitPrice parameter value (25.00) is applied to the @UnitPrice parameter in the SelectCommand before being sent to the database. 결과적으로 $25.00 보다 작거나 같은 제품만 Products 테이블에서 반환 됩니다.The net result is that only those products less than or equal to $25.00 are returned from the Products table. 이를 확인 하려면 GridView를 페이지에 추가 하 고이 데이터 원본에 바인딩한 다음 브라우저를 통해 페이지를 봅니다.To confirm this, add a GridView to the page, bind it to this data source, and then view the page through a browser. 그림 3에서 확인 하는 것 처럼 나열 된 제품만 $25.00 보다 작거나 같아야 합니다.You should only see those products listed that are less than or equal to $25.00, as Figure 3 confirms.

$25.00 보다 작거나 같은 제품만 표시 됩니다.Only Those Products Less Than or Equal to $25.00 are Displayed

그림 3: $25.00 보다 작거나 같은 제품만 표시 됩니다 (전체 크기 이미지를 보려면 클릭).Figure 3: Only Those Products Less Than or Equal to $25.00 are Displayed (Click to view full-size image)

2 단계: 사용자 지정 SQL 문에 매개 변수 추가Step 2: Adding Parameters to a Custom SQL Statement

사용자 지정 SQL 문을 추가할 때 WHERE 절을 명시적으로 입력 하거나 쿼리 작성기의 필터 셀에 값을 지정할 수 있습니다.When adding a custom SQL statement you can enter the WHERE clause explicitly or specify a value in the Filter cell of the Query Builder. 이를 보여 주기 위해 s s 1이 특정 임계값 보다 작은 GridView의 제품만 표시 해 보겠습니다.To demonstrate this, let s display just those products in a GridView whose prices are less than a certain threshold. ParameterizedQueries.aspx 페이지에 TextBox를 추가 하 여 사용자 로부터이 임계값을 수집 하는 것부터 시작 합니다.Start by adding a TextBox to the ParameterizedQueries.aspx page to collect this threshold value from the user. TextBox s ID 속성을 MaxPrice로 설정 합니다.Set the TextBox s ID property to MaxPrice. 단추 웹 컨트롤을 추가 하 고 해당 Text 속성을 설정 하 여 일치 하는 제품을 표시 합니다.Add a Button Web control and set its Text property to Display Matching Products .

그런 다음 GridView를 페이지로 끌고 해당 스마트 태그에서 ProductsFilteredByPriceDataSource라는 새 SqlDataSource를 만들도록 선택 합니다.Next, drag a GridView onto the page and from its smart tag choose to create a new SqlDataSource named ProductsFilteredByPriceDataSource. 데이터 원본 구성 마법사에서 사용자 지정 SQL 문 또는 저장 프로시저 지정 화면으로 이동 하 여 (그림 4 참조) 다음 쿼리를 입력 합니다.From the Configure Data Source wizard, proceed to the Specify a custom SQL statement or stored procedure screen (see Figure 4) and enter the following query:

SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice

수동으로 또는 쿼리 작성기를 통해 쿼리를 입력 한 후 다음을 클릭 합니다.After entering the query (either manually or through the Query Builder), click Next.

매개 변수 값 보다 작거나 같은 제품만 반환 합니다.Return Only Those Products Less Than or Equal to a Parameter Value

그림 4: 매개 변수 값 보다 작거나 같은 제품만 반환 (전체 크기 이미지를 보려면 클릭)Figure 4: Return Only Those Products Less Than or Equal to a Parameter Value (Click to view full-size image)

쿼리에 매개 변수가 포함 되어 있으므로 마법사의 다음 화면에서 매개 변수 값의 원본을 묻는 메시지를 표시 합니다.Since the query includes parameters, the next screen in the wizard prompts us for the source of the parameters values. 매개 변수 원본 드롭다운 목록에서 컨트롤을 선택 하 고 ControlID 드롭다운 목록에서 MaxPrice (TextBox 컨트롤 s ID 값)을 선택 합니다.Choose Control from the Parameter source drop-down list and MaxPrice (the TextBox control s ID value) from the ControlID drop-down list. 사용자가 MaxPrice 텍스트 상자에 텍스트를 입력 하지 않은 경우에 사용할 선택적 기본값을 입력할 수도 있습니다.You can also enter an optional default value to use in the case where the user has not entered any text into the MaxPrice TextBox. 이때 기본값을 입력 하지 마십시오.For the time being, do not enter a default value.

MaxPrice TextBox s Text 속성이 매개 변수 원본으로 사용 The MaxPrice TextBox s Text Property is Used as the Parameter Source

그림 5: MaxPrice TextBox s Text 속성은 매개 변수 소스로 사용 됩니다 (전체 크기 이미지를 보려면 클릭).Figure 5: The MaxPrice TextBox s Text Property is Used as the Parameter Source (Click to view full-size image)

다음, 마침을 차례로 클릭 하 여 데이터 소스 구성 마법사를 완료 합니다.Complete the Configure Data Source wizard by clicking Next, then Finish. GridView, TextBox, Button 및 SqlDataSource의 선언 태그는 다음과 같습니다.The declarative markup for the GridView, TextBox, Button, and SqlDataSource follows:

Maximum price:
$<asp:TextBox ID="MaxPrice" runat="server" Columns="5" />
 
<asp:Button ID="DisplayProductsLessThanButton" runat="server"
    Text="Display Matching Products" />
<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False"
    DataSourceID="ProductsFilteredByPriceDataSource" EnableViewState="False">
    <Columns>
        <asp:BoundField DataField="ProductName" HeaderText="Product"
            SortExpression="ProductName" />
        <asp:BoundField DataField="UnitPrice" HeaderText="Price"
            HtmlEncode="False" DataFormatString="{0:c}"
            SortExpression="UnitPrice" />
    </Columns>
</asp:GridView>
<asp:SqlDataSource ID="ProductsFilteredByPriceDataSource" runat="server"
    ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
    SelectCommand=
        "SELECT ProductName, UnitPrice 
        FROM Products WHERE UnitPrice <= @MaximumPrice">
    <SelectParameters>
        <asp:ControlParameter ControlID="MaxPrice" Name="MaximumPrice"
            PropertyName="Text" />
    </SelectParameters>
</asp:SqlDataSource>

SqlDataSource s <SelectParameters> 섹션 내의 매개 변수는 ControlParameter이며 ControlIDPropertyName같은 추가 속성을 포함 합니다.Note that the parameter within the SqlDataSource s <SelectParameters> section is a ControlParameter, which includes additional properties like ControlID and PropertyName. SqlDataSource s Select() 메서드가 호출 되 면 ControlParameter는 지정 된 웹 컨트롤 속성의 값을 가져와 하 고이를 SelectCommand의 해당 매개 변수에 할당 합니다.When the SqlDataSource s Select() method is invoked, the ControlParameter grabs the value from the specified Web control property and assigns it to the corresponding parameter in the SelectCommand. 이 예에서는 MaxPrice s Text 속성이 @MaxPrice 매개 변수 값으로 사용 됩니다.In this example, the MaxPrice s Text property is used as the @MaxPrice parameter value.

잠시 시간을 내 서 브라우저를 통해이 페이지를 봅니다.Take a minute to view this page through a browser. 페이지를 처음 방문 하거나 MaxPrice 텍스트 상자에 값이 없을 때마다 GridView에 레코드가 표시 되지 않습니다.When first visiting the page or whenever the MaxPrice TextBox lacks a value no records are displayed in the GridView.

MaxPrice TextBox가 비어 있을 때 레코드가 표시 되지 No Records are Displayed When the MaxPrice TextBox is Empty

그림 6: MaxPrice TextBox가 비어 있을 때 레코드가 표시 되지 않음 (전체 크기 이미지를 보려면 클릭)Figure 6: No Records are Displayed When the MaxPrice TextBox is Empty (Click to view full-size image)

제품이 표시 되지 않는 이유는 기본적으로 매개 변수 값에 대 한 빈 문자열이 데이터베이스 NULL 값으로 변환 되기 때문입니다.The reason no products are shown is because, by default, an empty string for a parameter value is converted into a database NULL value. [UnitPrice] <= NULL 비교는 항상 False로 평가 되므로 결과가 반환 되지 않습니다.Since the comparison of [UnitPrice] <= NULL always evaluates as False, no results are returned.

텍스트 상자에 값 (예: 5.00)을 입력 하 고 일치 하는 제품 표시 단추를 클릭 합니다.Enter a value into the textbox, like 5.00, and click the Display Matching Products button. 다시 게시 시 SqlDataSource는 해당 매개 변수 소스 중 하나가 변경 되었음을 GridView에 알립니다.On postback, the SqlDataSource informs the GridView that one of its parameter sources has changed. 따라서 GridView는 SqlDataSource에 다시 바인딩되어 $5.00 보다 작거나 같은 제품을 표시 합니다.Consequently, the GridView rebinds to the SqlDataSource, displaying those products less than or equal to $5.00.

$5.00 보다 작거나 같은 제품이 표시 됩니다.Products Less Than or Equal to $5.00 are Displayed

그림 7: $5.00 보다 작거나 같은 제품이 표시 됩니다 (전체 크기 이미지를 보려면 클릭).Figure 7: Products Less Than or Equal to $5.00 are Displayed (Click to view full-size image)

처음에 모든 제품 표시Initially Displaying All Products

페이지가 처음 로드 될 때 제품을 표시 하지 않고 모든 제품을 표시 하는 것이 좋습니다.Rather than displaying no products when the page is first loaded, we may want to display all products. MaxPrice TextBox가 비어 있을 때마다 모든 제품을 나열 하는 한 가지 방법은 Northwind Traders가 $100만을 초과 하는 재고를 보유 하 고 있는 것은 아니기 때문에 100만와 같이 매개 변수의 기본값을 만드세요 high value로 설정 하는 것입니다.One way to list all products whenever the MaxPrice TextBox is empty is to set the parameter s default value to some insanely high value, like 1000000, since it s unlikely that Northwind Traders will ever have inventory whose unit price exceeds $1,000,000. 그러나이 방법은 shortsighted 다른 상황에서 작동 하지 않을 수 있습니다.However, this approach is shortsighted and might not work in other situations.

이전 자습서에서는 선언적 매개 변수DropDownList을 사용 하 여 마스터/세부 정보 필터링 에서 유사한 문제가 발생 했습니다.In previous tutorials - Declarative Parameters and Master/Detail Filtering With a DropDownList we were faced with a similar problem. Microsoft의 솔루션은이 논리를 비즈니스 논리 계층에 배치 하는 것 이었습니다.Our solution there was to put this logic in the Business Logic Layer. 특히, BLL에서 들어오는 값을 검사 하 고 NULL 또는 예약 된 값이 있는 경우 호출은 모든 레코드를 반환 하는 DAL 메서드로 라우팅됩니다.Specifically, the BLL examined the incoming value and, if it was NULL or some reserved value, the call was routed to the DAL method that returned all records. 들어오는 값이 표준 필터링 값인 경우 제공 된 값을 사용 하 여 매개 변수가 있는 WHERE 절을 사용 하는 SQL 문을 실행 한 DAL 메서드가 호출 됩니다.If the incoming value was a normal filtering value, a call was made to the DAL method that executed a SQL statement that used a parameterized WHERE clause with the supplied value.

아쉽게도 SqlDataSource를 사용할 때 아키텍처를 우회 합니다.Unfortunately, we bypass the architecture when using the SqlDataSource. 대신 @MaximumPrice 매개 변수가 NULL 되거나 예약 된 값이 있는 경우 모든 레코드를 지능적으로 가져오는 SQL 문을 사용자 지정 해야 합니다.Instead, we need to customize the SQL statement to intelligently grab all records if the @MaximumPrice parameter is NULL or some reserved value. 이 연습에서는 @MaximumPrice 매개 변수가 -1.0와 같으면 모든 레코드가 반환 됩니다. (-1.0에는 음수 UnitPrice 값을 가질 수 없으므로 예약 된 값으로 작동 합니다.)For this exercise, let s have it so that if the @MaximumPrice parameter is equal to -1.0, then all of the records are to be returned (-1.0 works as a reserved value since no product can have a negative UnitPrice value). 이를 위해 다음 SQL 문을 사용할 수 있습니다.To accomplish this we can use the following SQL statement:

SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice OR @MaximumPrice = -1.0

@MaximumPrice 매개 변수가 -1.0인 경우이 WHERE 절은 모든 레코드를 반환 합니다.This WHERE clause returns all records if the @MaximumPrice parameter equals -1.0. 매개 변수 값이 -1.0되지 않은 경우 UnitPrice @MaximumPrice 매개 변수 값 보다 작거나 같은 제품만 반환 됩니다.If the parameter value is not -1.0, only those products whose UnitPrice is less than or equal to the @MaximumPrice parameter value are returned. @MaximumPrice 매개 변수의 기본값을 -1.0로 설정 하면 첫 번째 페이지 로드 (또는 MaxPrice TextBox가 비어 있을 때마다)에서 @MaximumPrice -1.0 값이 표시 되 고 모든 제품이 표시 됩니다.By setting the default value of the @MaximumPrice parameter to -1.0, on the first page load (or whenever the MaxPrice TextBox is empty), @MaximumPrice will have a value of -1.0 and all products will be displayed.

MaxPrice TextBox가 비어 있는 경우 모든 제품이 표시 됩니다.Now All Products are Displayed When the MaxPrice TextBox is Empty

그림 8: 이제 MaxPrice TextBox가 비어 있을 때 모든 제품이 표시 됨 (전체 크기 이미지를 보려면 클릭)Figure 8: Now All Products are Displayed When the MaxPrice TextBox is Empty (Click to view full-size image)

이 방법에 유의 해야 할 몇 가지 주의 사항이 있습니다.There are a couple of caveats to note with this approach. 먼저 SQL 쿼리에서 사용 되는 매개 변수의 데이터 형식을 유추 합니다.First, realize that the parameter s data type is inferred by it s usage in the SQL query. WHERE 절을 @MaximumPrice = -1.0에서 @MaximumPrice = -1으로 변경 하면 런타임에서는 매개 변수를 정수로 처리 합니다.If you change the WHERE clause from @MaximumPrice = -1.0 to @MaximumPrice = -1, the runtime treats the parameter as an integer. 그런 다음 MaxPrice 텍스트 상자를 10 진수 값 (예: 5.00)에 할당 하려고 하면 5.00을 정수로 변환할 수 없으므로 오류가 발생 합니다.If you then attempt to assign the MaxPrice TextBox to a decimal value (like 5.00 ), an error will occur because it cannot convert 5.00 to an integer. 이를 해결 하려면 WHERE 절에서 @MaximumPrice = -1.0를 사용 하 고 있는지 확인 하 고, ControlParameter 개체 s Type 속성을 10 진수로 설정 합니다.To remedy this, either make sure that you use @MaximumPrice = -1.0 in the WHERE clause or, better yet, set the ControlParameter object s Type property to Decimal .

둘째, WHERE 절에 OR @MaximumPrice = -1.0를 추가 하 여 쿼리 엔진이 UnitPrice (있는 경우)에서 인덱스를 사용할 수 없기 때문에 테이블 스캔이 발생 합니다.Secondly, by adding the OR @MaximumPrice = -1.0 to the WHERE clause, the query engine cannot use an index on UnitPrice (assuming one exists), thereby resulting in a table scan. 이는 Products 테이블에 충분 한 수의 레코드가 있는 경우 성능에 영향을 줄 수 있습니다.This can impact performance if there are a sufficiently large number of records in the Products table. 이 논리를 저장 프로시저로 이동 하는 것이 더 효율적입니다. 모든 레코드를 반환 해야 하는 경우에는 WHERE 절을 사용 하지 않고 Products 테이블에서 SELECT 쿼리를 수행 하는 것이 IF 문이 WHERE 조건을 포함 하 여 인덱스를 사용할 수 있도록 해야 합니다.UnitPriceA better approach would be to move this logic to a stored procedure where an IF statement would either perform a SELECT query from the Products table without a WHERE clause when all records need to be returned or one whose WHERE clause contains just the UnitPrice criteria, so that an index can be used.

3 단계: 매개 변수화 된 저장 프로시저 만들기 및 사용Step 3: Creating and Using Parameterized Stored Procedures

저장 프로시저에는 저장 프로시저 내에 정의 된 SQL 문에 사용할 수 있는 입력 매개 변수 집합이 포함 될 수 있습니다.Stored procedures can include a set of input parameters that can then be used in the SQL statement(s) defined within the stored procedure. SqlDataSource에서 입력 매개 변수를 허용 하는 저장 프로시저를 사용 하도록 구성 하는 경우 이러한 매개 변수 값은 임시 SQL 문과 동일한 기술을 사용 하 여 지정할 수 있습니다.When configuring the SqlDataSource to use a stored procedure that accepts input parameters, these parameter values can be specified using the same techniques as with ad-hoc SQL statements.

SqlDataSource에서 저장 프로시저를 사용 하는 방법을 보여 주기 위해 GetProductsByCategory라는 Northwind 데이터베이스에 새 저장 프로시저를 만들어 보겠습니다. 그러면 @CategoryID 라는 매개 변수를 수락 하 고 CategoryID 열이 @CategoryID와 일치 하는 제품의 모든 열을 반환 합니다.To illustrate using stored procedures in the SqlDataSource, let s create a new stored procedure in the Northwind database named GetProductsByCategory, which accepts a parameter named @CategoryID and returns all of the columns of the products whose CategoryID column matches @CategoryID. 저장 프로시저를 만들려면 서버 탐색기로 이동 하 여 NORTHWND.MDF 데이터베이스로 드릴 다운 합니다.To create a stored procedure, go to the Server Explorer and drill down into the NORTHWND.MDF database. 서버 탐색기 표시 되지 않으면 보기 메뉴로 이동 하 여 서버 탐색기 옵션을 선택 합니다.(If you don t see the Server Explorer, bring it up by going to the View menu and selecting the Server Explorer option.)

NORTHWND.MDF 데이터베이스에서 저장 프로시저 폴더를 마우스 오른쪽 단추로 클릭 하 고 새 저장 프로시저 추가를 선택 하 고 다음 구문을 입력 합니다.From the NORTHWND.MDF database, right-click on the Stored Procedures folder, choose Add New Stored Procedure, and enter the following syntax:

CREATE PROCEDURE dbo.GetProductsByCategory
(
      @CategoryID int
)
AS
SELECT *
FROM Products
WHERE CategoryID = @CategoryID

저장 아이콘 (또는 Ctrl + S)을 클릭 하 여 저장 프로시저를 저장 합니다.Click the Save icon (or Ctrl+S) to save the stored procedure. 저장 프로시저 폴더에서 마우스 오른쪽 단추를 클릭 하 고 실행을 선택 하 여 저장 프로시저를 테스트할 수 있습니다.You can test the stored procedure by right-clicking it from the Stored Procedures folder and choosing Execute. 이렇게 하면 저장 프로시저의 매개 변수 (이 인스턴스에서@CategoryID)를 입력 하 라는 메시지가 표시 되 고 그 후에 결과가 출력 창에 표시 됩니다.This will prompt you for the stored procedure s parameters (@CategoryID, in this instance), after which the results will be displayed in the Output window.

@CategoryID 1을 사용 하 여 실행 될 때 GetProductsByCategory 저장 프로시저 The GetProductsByCategory Stored Procedure when Executed with a @CategoryID of 1

그림 9: @CategoryID 1을 사용 하 여 실행 되는 GetProductsByCategory 저장 프로시저 (전체 크기 이미지를 보려면 클릭)Figure 9: The GetProductsByCategory Stored Procedure when Executed with a @CategoryID of 1 (Click to view full-size image)

에서이 저장 프로시저를 사용 하 여 GridView의 음료 범주에 있는 모든 제품을 표시 하도록 합니다.Let s use this stored procedure to display all products in the Beverages category in a GridView. 새 GridView를 페이지에 추가 하 고 BeverageProductsDataSource이라는 새 SqlDataSource에 바인딩합니다.Add a new GridView to the page and bind it to a new SqlDataSource named BeverageProductsDataSource. 사용자 지정 SQL 문 또는 저장 프로시저 지정 화면으로 이동 하 여 저장 프로시저 라디오 단추를 선택 하 고 드롭다운 목록에서 GetProductsByCategory 저장 프로시저를 선택 합니다.Continue to the Specify a custom SQL statement or stored procedure screen, select the Stored procedure radio button, and pick the GetProductsByCategory stored procedure from the drop-down list.

드롭다운 목록에서 GetProductsByCategory 저장 프로시저 선택 합니다.Select the GetProductsByCategory Stored Procedure from the Drop-Down List

그림 10: 드롭다운 목록에서 GetProductsByCategory 저장 프로시저 선택 (전체 크기 이미지를 보려면 클릭)Figure 10: Select the GetProductsByCategory Stored Procedure from the Drop-Down List (Click to view full-size image)

저장 프로시저는 입력 매개 변수 (@CategoryID)를 허용 하므로 다음을 클릭 하 여이 매개 변수 값의 원본을 지정 하 라는 메시지를 표시 합니다.Since the stored procedure accepts an input parameter (@CategoryID), clicking Next prompts us to specify the source for this parameter s value. 음료 CategoryID 1 이므로 매개 변수 원본 드롭다운 목록을 None으로 두고 DefaultValue 텍스트 상자에 1을 입력 합니다.The Beverages CategoryID is 1, so leave the Parameter source drop-down list at None and enter 1 into the DefaultValue textbox.

하드 코드 된 값 1을 사용 하 여 음료 범주의 제품을 반환 Use a Hard-Coded Value of 1 to Return the Products in the Beverages Category

그림 11: 하드 코드 된 값 1을 사용 하 여 음료 범주의 제품 반환 (전체 크기 이미지를 보려면 클릭)Figure 11: Use a Hard-Coded Value of 1 to Return the Products in the Beverages Category (Click to view full-size image)

다음 선언 태그와 같이 저장 프로시저를 사용할 때 SqlDataSource s SelectCommand 속성은 저장 프로시저의 이름으로 설정 되 고 SelectCommandType 속성StoredProcedure로 설정 되며이는 SelectCommand이 임시 SQL 문이 아닌 저장 프로시저의 이름 임을 나타냅니다.As the following declarative markup shows, when using a stored procedure, the SqlDataSource s SelectCommand property is set to the name of the stored procedure and the SelectCommandType property is set to StoredProcedure, indicating that the SelectCommand is the name of a stored procedure rather than an ad-hoc SQL statement.

<asp:SqlDataSource ID="BeverageProductsDataSource" runat="server"
    ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
    SelectCommand="GetProductsByCategory" SelectCommandType="StoredProcedure">
    <SelectParameters>
        <asp:Parameter DefaultValue="1" Name="CategoryID" Type="Int32" />
    </SelectParameters>
</asp:SqlDataSource>

브라우저에서 페이지를 테스트 합니다.Test out the page in a browser. GetProductsByCategory 저장 프로시저가 Products 테이블의 모든 열을 반환 하기 때문에 모든 product 필드가 표시 되기는 하지만 음료 범주에 속하는 제품만 표시 됩니다.Only those products that belong to the Beverages category are displayed, although all of the product fields are displayed since the GetProductsByCategory stored procedure returns all of the columns from the Products table. 물론 gridview s 열 편집 대화 상자에서 GridView에 표시 되는 필드를 제한 하거나 사용자 지정할 수 있습니다.We could, of course, limit or customize the fields displayed in the GridView from the GridView s Edit Columns dialog box.

모든 음료를 표시 All of the Beverages are Displayed

그림 12: 모든 음료 표시 (전체 크기 이미지를 보려면 클릭)Figure 12: All of the Beverages are Displayed (Click to view full-size image)

4 단계: 프로그래밍 방식으로 SqlDataSource sSelect()문 호출Step 4: Programmatically Invoking a SqlDataSource sSelect()Statement

지금까지 이전 자습서 및이 자습서에서 살펴본 예제는 SqlDataSource 컨트롤을 GridView에 직접 바인딩 했습니다.The examples we ve seen in the previous tutorial and this tutorial so far have bound SqlDataSource controls directly to a GridView. 그러나 SqlDataSource 컨트롤의 데이터를 프로그래밍 방식으로 액세스 하 고 코드에서 열거할 수 있습니다.The SqlDataSource control s data, however, can be programmatically accessed and enumerated in code. 이는 데이터를 검사 하기 위해 쿼리 해야 하지만 표시할 필요가 없는 경우에 특히 유용할 수 있습니다.This can be particularly useful when you need to query data to inspect it, but don t need to display it. 모든 상용구 ADO.NET 코드를 작성 하 여 데이터베이스에 연결 하 고, 명령을 지정 하 고, 결과를 검색 하는 대신 SqlDataSource가이 단조로운 코드를 처리할 수 있도록 합니다.Rather than having to write all of the boilerplate ADO.NET code to connect to the database, specify the command, and retrieve the results, you can let the SqlDataSource handle this monotonous code.

프로그래밍 방식으로 SqlDataSource s 데이터를 사용 하는 방법을 설명 하기 위해 상사가 임의로 선택 된 범주 및 관련 제품의 이름을 표시 하는 웹 페이지를 만들도록 요청 하는 것으로 가정 합니다.To illustrate working with the SqlDataSource s data programmatically, imagine that your boss has approached you with a request to create a web page that displays the name of a randomly selected category and its associated products. 즉, 사용자가이 페이지를 방문 하면 Categories 테이블에서 임의로 범주를 선택 하 고 범주 이름을 표시 한 다음 해당 범주에 속하는 제품을 나열 하려고 합니다.That is, when a user visits this page, we want to randomly choose a category from the Categories table, display the category name, and then list the products belonging to that category.

이를 위해서는 두 개의 SqlDataSource 컨트롤이 Categories 테이블에서 임의의 범주를 잡고 다른 범주를 가져오도록 해야 합니다.To accomplish this we need two SqlDataSource controls one to grab a random category from the Categories table and another to get the category s products. 이 단계에서 임의의 범주 레코드를 검색 하는 SqlDataSource를 빌드합니다. 5 단계에서는 범주 제품을 검색 하는 SqlDataSource를 만드는 방법을 살펴봅니다.We'll build the SqlDataSource that retrieves a random category record in this step; Step 5 looks at crafting the SqlDataSource that retrieves the category s products.

ParameterizedQueries.aspx에 SqlDataSource를 추가 하 여 시작 하 고 IDRandomCategoryDataSource로 설정 합니다.Start by adding a SqlDataSource to ParameterizedQueries.aspx and set its ID to RandomCategoryDataSource. 다음 SQL 쿼리를 사용 하도록 구성 합니다.Configure it so that it uses the following SQL query:

SELECT TOP 1 CategoryID, CategoryName
FROM Categories
ORDER BY NEWID()

ORDER BY NEWID()는 임의의 순서로 정렬 된 레코드를 반환 합니다 ( NEWID()를 사용 하 여 레코드를 임의로 정렬).ORDER BY NEWID() returns the records sorted in random order (see Using NEWID() to Randomly Sort Records). SELECT TOP 1 결과 집합에서 첫 번째 레코드를 반환 합니다.SELECT TOP 1 returns the first record from the result set. 이 쿼리에서는 임의로 선택 된 단일 범주의 CategoryIDCategoryName 열 값을 반환 합니다.Put together, this query returns the CategoryID and CategoryName column values from a single, randomly selected category.

범주 CategoryName 값을 표시 하려면 레이블 웹 컨트롤을 페이지에 추가 하 고 해당 ID 속성을 CategoryNameLabel로 설정 하 고 Text 속성을 선택 취소 합니다.To display the category s CategoryName value, add a Label Web control to the page, set its ID property to CategoryNameLabel, and clear out its Text property. SqlDataSource 컨트롤에서 데이터를 프로그래밍 방식으로 검색 하려면 해당 Select() 메서드를 호출 해야 합니다.To programmatically retrieve the data from a SqlDataSource control, we need to invoke its Select() method. Select() 메서드에 는 데이터를 반환 하기 전에 메시지 하는 방법을 지정 하는 DataSourceSelectArguments형식의 단일 입력 매개 변수가 필요 합니다.The Select() method expects a single input parameter of type DataSourceSelectArguments, which specifies how the data should be messaged before being returned. 여기에는 데이터 정렬 및 필터링에 대 한 지침이 포함 될 수 있으며, SqlDataSource 컨트롤의 데이터를 정렬 하거나 페이징할 때 데이터 웹 컨트롤에서 사용 됩니다.This can include instructions on sorting and filtering the data, and is used by the data Web controls when sorting or paging through the data from a SqlDataSource control. 그러나이 예제에서는 데이터를 반환 하기 전에 수정할 필요가 없으므로 DataSourceSelectArguments.Empty 개체를 전달 합니다.For our example, though, we don t need the data to be modified before being returned, and therefore will pass in the DataSourceSelectArguments.Empty object.

Select() 메서드는 IEnumerable를 구현 하는 개체를 반환 합니다.The Select() method returns an object that implements IEnumerable. 반환 되는 정확한 형식은 SqlDataSource 컨트롤의 DataSourceMode 속성값에 따라 다릅니다.The precise type returned depends on the value of the SqlDataSource control s DataSourceMode property. 이전 자습서에서 설명한 대로이 속성은 DataSet 또는 DataReader값으로 설정할 수 있습니다.As discussed in the previous tutorial, this property can be set to a value of either DataSet or DataReader. DataSet로 설정 된 경우 Select() 메서드는 DataView 개체를 반환 합니다. DataReader로 설정 된 경우 IDataReader를 구현 하는 개체를 반환 합니다.If set to DataSet, the Select() method returns a DataView object; if set to DataReader, it returns an object that implements IDataReader. RandomCategoryDataSource SqlDataSource는 DataSourceMode 속성을 DataSet (기본값)로 설정 하므로 DataView 개체를 사용 하 게 됩니다.Since the RandomCategoryDataSource SqlDataSource has its DataSourceMode property set to DataSet (the default), we will be working with a DataView object.

다음 코드에서는 RandomCategoryDataSource SqlDataSource에서 DataView로 레코드를 검색 하는 방법 뿐만 아니라 첫 번째 DataView 행에서 CategoryName 열 값을 읽는 방법을 보여 줍니다.The following code illustrates how to retrieve the records from the RandomCategoryDataSource SqlDataSource as a DataView as well as how to read the CategoryName column value from the first DataView row:

protected void Page_Load(object sender, EventArgs e)
{
    // Get the data from the SqlDataSource as a DataView
    DataView randomCategoryView =
        (DataView)RandomCategoryDataSource.Select(DataSourceSelectArguments.Empty);
    if (randomCategoryView.Count > 0)
    {
        // Assign the CategoryName value to the Label
        CategoryNameLabel.Text =
            string.Format("Here are Products in the {0} Category...",
                randomCategoryView[0]["CategoryName"].ToString());
    }
}

randomCategoryView[0]는 DataView의 첫 번째 DataRowView를 반환 합니다.randomCategoryView[0] returns the first DataRowView in the DataView. randomCategoryView[0]["CategoryName"]는이 첫 번째 행의 CategoryName 열 값을 반환 합니다.randomCategoryView[0]["CategoryName"] returns the value of the CategoryName column in this first row. DataView는 느슨하게 형식화 되어 있습니다.Note that the DataView is loosely-typed. 특정 열 값을 참조 하려면 열 이름을 문자열 (이 경우 범주)로 전달 해야 합니다.To reference a particular column value we need to pass in the name of the column as a string ( CategoryName, in this case). 그림 13에서는 페이지를 볼 때 CategoryNameLabel에 표시 되는 메시지를 보여 줍니다.Figure 13 shows the message displayed in the CategoryNameLabel when viewing the page. 물론 표시 되는 실제 범주 이름은 페이지를 방문할 때마다 (다시 게시 포함) RandomCategoryDataSource SqlDataSource에서 임의로 선택 됩니다.Of course, the actual category name displayed is randomly selected by the RandomCategoryDataSource SqlDataSource on each visit to the page (including postbacks).

임의로 선택한 범주 이름을 표시 됩니다.The Randomly Selected Category s Name is Displayed

그림 13: 임의로 선택한 범주 이름 표시 (전체 크기 이미지를 보려면 클릭)Figure 13: The Randomly Selected Category s Name is Displayed (Click to view full-size image)

Note

SqlDataSource 컨트롤 s DataSourceMode 속성이 DataReader로 설정 된 경우 Select() 메서드의 반환 값을 IDataReader캐스팅 해야 합니다.If the SqlDataSource control s DataSourceMode property had been set to DataReader, the return value from the Select() method would have needed to be cast to IDataReader. 첫 번째 행에서 CategoryName 열 값을 읽으려면 다음 코드와 같은 코드를 사용 합니다.To read the CategoryName column value from the first row, we d use code like:

if (randomCategoryReader.Read())
{
   string categoryName = randomCategoryReader["CategoryName"].ToString();
   ...
}

SqlDataSource가 범주를 임의로 선택 하면 범주 제품을 나열 하는 GridView를 추가할 준비가 된 것입니다.With the SqlDataSource randomly selecting a category, we re ready to add the GridView that lists the category s products.

Note

레이블 웹 컨트롤을 사용 하 여 범주 이름을 표시 하는 대신, 페이지에 FormView 또는 DetailsView을 추가 하 여 SqlDataSource에 바인딩하면 됩니다.Rather than using a Label Web control to display the category s name, we could have added a FormView or DetailsView to the page, binding it to the SqlDataSource. 그러나 레이블을 사용 하 여 프로그래밍 방식으로 SqlDataSource s Select() 문을 호출 하 고 결과 데이터를 코드에서 사용 하는 방법을 탐색할 수 있었습니다.Using the Label, however, allowed us to explore how to programmatically invoke the SqlDataSource s Select() statement and work with its resulting data in code.

5 단계: 프로그래밍 방식으로 매개 변수 값 할당Step 5: Assigning Parameter Values Programmatically

이 자습서에서 지금까지 살펴본 모든 예제는 하드 코드 된 매개 변수 값 또는 미리 정의 된 매개 변수 원본 중 하나에서 가져온 값 (querystring 값, 페이지의 웹 컨트롤 등) 중 하나를 사용 했습니다.All of the examples we ve seen so far in this tutorial have used either a hard-coded parameter value or one taken from one of the pre-defined parameter sources (a querystring value, a Web control on the page, and so on). 그러나 SqlDataSource 컨트롤의 매개 변수를 프로그래밍 방식으로 설정할 수도 있습니다.However, the SqlDataSource control s parameters can also be set programmatically. 현재 예제를 완료 하려면 지정 된 범주에 속하는 모든 제품을 반환 하는 SqlDataSource가 필요 합니다.To complete our current example, we need a SqlDataSource that returns all of the products belonging to a specified category. 이 SqlDataSource는 Page_Load 이벤트 처리기에서 RandomCategoryDataSource SqlDataSource에서 반환 된 CategoryID 열 값을 기반으로 값을 설정 해야 하는 CategoryID 매개 변수를 포함 합니다.This SqlDataSource will have a CategoryID parameter whose value needs to be set based on the CategoryID column value returned by the RandomCategoryDataSource SqlDataSource in the Page_Load event handler.

먼저 페이지에 GridView를 추가 하 고이를 ProductsByCategoryDataSource라는 새 SqlDataSource에 바인딩합니다.Start by adding a GridView to the page and bind it to a new SqlDataSource named ProductsByCategoryDataSource. 3 단계에서와 같이 GetProductsByCategory 저장 프로시저를 호출 하도록 SqlDataSource를 구성 합니다.Much like we did in Step 3, configure the SqlDataSource so that it invokes the GetProductsByCategory stored procedure. 매개 변수 소스 드롭다운 목록을 None으로 설정 된 채로 두고이 기본값을 프로그래밍 방식으로 설정 하므로 기본값을 입력 하지 않습니다.Leave the Parameter source drop-down list set to None, but do not enter a default value, as we will set this default value programmatically.

매개 변수 소스 또는 기본값을 지정 하지 Do Not Specify a Parameter Source or Default Value

그림 14: 매개 변수 소스 또는 기본값을 지정 하지 않음 (전체 크기 이미지를 보려면 클릭)Figure 14: Do Not Specify a Parameter Source or Default Value (Click to view full-size image)

SqlDataSource 마법사를 완료 한 후 결과 선언 태그는 다음과 같이 표시 됩니다.After completing the SqlDataSource wizard, the resulting declarative markup should look similar to the following:

<asp:SqlDataSource ID="ProductsByCategoryDataSource" runat="server"
    ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
    SelectCommand="GetProductsByCategory" SelectCommandType="StoredProcedure">
    <SelectParameters>
        <asp:Parameter Name="CategoryID" Type="Int32" />
    </SelectParameters>
</asp:SqlDataSource>

Page_Load 이벤트 처리기에서 프로그래밍 방식으로 CategoryID 매개 변수의 DefaultValue을 할당할 수 있습니다.We can assign the DefaultValue of the CategoryID parameter programmatically in the Page_Load event handler:

// Assign the ProductsByCategoryDataSource's
// CategoryID parameter's DefaultValue property
ProductsByCategoryDataSource.SelectParameters["CategoryID"].DefaultValue =
    randomCategoryView[0]["CategoryID"].ToString();

이 외에도 페이지에는 임의로 선택 된 범주와 관련 된 제품을 보여 주는 GridView가 포함 되어 있습니다.With this addition, the page includes a GridView that shows the products associated with the randomly selected category.

매개 변수 소스 또는 기본값을 지정 하지 Do Not Specify a Parameter Source or Default Value

그림 15: 매개 변수 소스 또는 기본값을 지정 하지 않음 (전체 크기 이미지를 보려면 클릭)Figure 15: Do Not Specify a Parameter Source or Default Value (Click to view full-size image)

요약Summary

SqlDataSource를 사용 하 여 페이지 개발자는 매개 변수 값이 하드 코딩 되거나 미리 정의 된 매개 변수 소스에서 끌어오고 프로그래밍 방식으로 할당 될 수 있는 매개 변수가 있는 쿼리를 정의할 수 있습니다.The SqlDataSource enables page developers to define parameterized queries whose parameter values can be hard-coded, pulled from pre-defined parameter sources, or assigned programmatically. 이 자습서에서는 임시 SQL 쿼리와 저장 프로시저 모두에 대해 데이터 원본 구성 마법사에서 매개 변수가 있는 쿼리를 작성 하는 방법을 살펴보았습니다.In this tutorial we saw how to craft a parameterized query from the Configure Data Source wizard for both ad-hoc SQL queries and stored procedures. 또한 하드 코드 된 매개 변수 소스와 웹 컨트롤을 매개 변수 소스로 사용 하 고 프로그래밍 방식으로 매개 변수 값을 지정 하는 방법을 살펴보았습니다.We also looked at using hard-coded parameter sources, a Web control as a parameter source, and programmatically specifying the parameter value.

ObjectDataSource와 마찬가지로, SqlDataSource는 기본 데이터를 수정 하는 기능을 제공 합니다.Like with the ObjectDataSource, the SqlDataSource also provides capabilities to modify its underlying data. 다음 자습서에서는 SqlDataSource를 사용 하 여 INSERT, UPDATEDELETE 문을 정의 하는 방법을 살펴보겠습니다.In the next tutorial we'll look at how to define INSERT, UPDATE, and DELETE statements with the SqlDataSource. 이러한 문이 추가 된 후에는 GridView, DetailsView 및 FormView 컨트롤에 내재 된 기능을 기본 제공 하는 삽입, 편집 및 삭제 기능을 활용할 수 있습니다.Once these statements have been added, we can utilize the built-in inserting, editing, and deleting features inherent to the GridView, DetailsView, and FormView controls.

행복 한 프로그래밍Happy Programming!

저자 정보About the Author

Scott Mitchell(7 개의 ASP/ASP. NET books 및 4GuysFromRolla.com창립자)은 1998부터 Microsoft 웹 기술을 사용 하 여 작업 했습니다.Scott Mitchell, author of seven ASP/ASP.NET books and founder of 4GuysFromRolla.com, has been working with Microsoft Web technologies since 1998. Scott은 독립 컨설턴트, 강사 및 기록기로 작동 합니다.Scott works as an independent consultant, trainer, and writer. 최신 책은 24 시간 이내에 ASP.NET 2.0을 sams teach yourself것입니다.His latest book is Sams Teach Yourself ASP.NET 2.0 in 24 Hours. mitchell@4GuysFromRolla.com에 도달할 수 있습니다 .He can be reached at mitchell@4GuysFromRolla.com. 또는 블로그를 통해 http://ScottOnWriting.NET에서 찾을 수 있습니다.or via his blog, which can be found at http://ScottOnWriting.NET.

특별히 감사 합니다.Special Thanks To

이 자습서 시리즈는 많은 유용한 검토자가 검토 했습니다.This tutorial series was reviewed by many helpful reviewers. 이 자습서의 리드 검토자는 Scott Clyde, Randell Schmidt 및 켄은 Pespisa입니다.Lead reviewers for this tutorial were Scott Clyde, Randell Schmidt, and Ken Pespisa. 예정 된 MSDN 문서를 검토 하는 데 관심이 있나요?Interested in reviewing my upcoming MSDN articles? 그렇다면mitchell@4GuysFromRolla.com에서 줄을 삭제 합니다.If so, drop me a line at mitchell@4GuysFromRolla.com.