SqlDataSource와 함께 매개 변수가 있는 쿼리 사용(VB)

작성자 : Scott Mitchell

PDF 다운로드

이 자습서에서는 SqlDataSource 컨트롤을 계속 살펴보고 매개 변수가 있는 쿼리를 정의하는 방법을 알아봅니다. 매개 변수는 선언적 및 프로그래밍 방식으로 모두 지정할 수 있으며 querystring, 세션 상태, 기타 컨트롤 등과 같은 여러 위치에서 끌어올 수 있습니다.

소개

이전 자습서에서는 SqlDataSource 컨트롤을 사용하여 데이터베이스에서 직접 데이터를 검색하는 방법을 알아보았습니다. 데이터 원본 구성 마법사를 사용하여 데이터베이스를 선택한 다음 테이블 또는 뷰에서 반환할 열을 선택할 수 있습니다. 사용자 지정 SQL 문을 입력합니다. 또는 저장 프로시저를 사용합니다. 테이블 또는 뷰에서 열을 선택하거나 사용자 지정 SQL 문을 입력하든 SqlDataSource 컨트롤의 SelectCommand 속성에는 결과 임시 SQL SELECT 문이 할당되며 SqlDataSource의 Select() 메서드가 호출될 때 실행되는 문 SELECT 입니다(프로그래밍 방식으로 또는 데이터 웹 컨트롤에서 자동으로).

이전 자습서 데모에서 사용된 SQL SELECT 문에는 절이 WHERE 없습니다. SELECT 문에서 절을 WHERE 사용하여 반환된 결과를 제한할 수 있습니다. 예를 들어 $ 50.00 이상의 비용이 드는 제품의 이름을 표시하려면 다음 쿼리를 사용할 수 있습니다.

SELECT ProductName
FROM Products
WHERE UnitPrice > 50.00

일반적으로 절에 WHERE 사용되는 값은 쿼리 문자열 값, 세션 변수 또는 페이지의 웹 컨트롤에서 사용자 입력과 같은 일부 외부 원본에 의해 결정됩니다. 이상적으로 이러한 입력은 매개 변수를 사용하여 지정됩니다. Microsoft SQL Server 매개 변수는 다음과 같이 를 사용하여 @parameterName표시됩니다.

SELECT ProductName
FROM Products
WHERE UnitPrice > @Price

SqlDataSource는 문과 INSERT, UPDATEDELETE 및 문 모두에 대해 SELECT 매개 변수가 있는 쿼리를 지원합니다. 또한 매개 변수 값은 쿼리 문자열, 세션 상태, 페이지의 컨트롤 등 다양한 원본에서 자동으로 끌어오거나 프로그래밍 방식으로 할당할 수 있습니다. 이 자습서에서는 매개 변수가 있는 쿼리를 정의하는 방법과 선언적 및 프로그래밍 방식으로 매개 변수 값을 지정하는 방법을 알아봅니다.

참고

이전 자습서에서는 처음 46개 자습서에서 선택한 도구였던 ObjectDataSource를 SqlDataSource와 비교하여 개념적 유사성을 확인했습니다. 이러한 유사성은 매개 변수로도 확장됩니다. 비즈니스 논리 계층의 메서드에 대한 입력 매개 변수에 매핑된 ObjectDataSource의 매개 변수입니다. SqlDataSource를 사용하면 매개 변수가 SQL 쿼리 내에서 직접 정의됩니다. 두 컨트롤 모두 , , Insert()Update()Delete() 메서드에 대한 Select()매개 변수 컬렉션을 가지며, 이러한 매개 변수 값은 미리 정의된 원본(쿼리 문자열 값, 세션 변수 등)에서 채워지거나 프로그래밍 방식으로 할당될 수 있습니다.

매개 변수가 있는 쿼리 만들기

SqlDataSource 컨트롤의 데이터 원본 구성 마법사는 데이터베이스 레코드를 검색하기 위해 실행할 명령을 정의하는 세 가지 방법을 제공합니다.

  • 기존 테이블 또는 뷰에서 열을 선택하여
  • 사용자 지정 SQL 문을 입력하거나
  • 저장 프로시저를 선택하여

기존 테이블 또는 뷰에서 열을 선택하는 경우 절 추가 WHERE 대화 상자를 통해 절에 WHERE 대한 매개 변수를 지정해야 합니다. 그러나 사용자 지정 SQL 문을 만들 때 절에 매개 변수를 WHERE 직접 입력할 수 있습니다(각 매개 변수를 나타내는 데 사용 @parameterName ). 저장 프로시저는 하나 이상의 SQL 문으로 구성되며 이러한 문을 매개 변수화할 수 있습니다. 그러나 SQL 문에 사용되는 매개 변수는 저장 프로시저에 입력 매개 변수로 전달되어야 합니다.

매개 변수가 있는 쿼리를 만드는 방법은 SqlDataSource를 SelectCommand 지정하는 방법에 따라 달라지기 때문에 세 가지 방법을 모두 살펴보겠습니다. 시작하려면 폴더에서 ParameterizedQueries.aspx 페이지를 열고 도구 상자에서 SqlDataSource Designer SqlDataSource 컨트롤을 끌어서 로 설정합니다 IDProducts25BucksAndUnderDataSource. 그런 다음 컨트롤의 스마트 태그에서 데이터 원본 구성 링크를 클릭합니다. 사용할 데이터베이스(NORTHWINDConnectionString)를 선택하고 다음을 클릭합니다.

1단계: 테이블 또는 뷰에서 열을 선택할 때 WHERE 절 추가

SqlDataSource 컨트롤을 사용하여 데이터베이스에서 반환할 데이터를 선택할 때 데이터 원본 구성 마법사를 사용하면 기존 테이블 또는 뷰에서 반환할 열을 선택할 수 있습니다(그림 1 참조). 이렇게 하면 SqlDataSource의 Select() 메서드가 호출될 때 데이터베이스로 전송되는 SQL SELECT 문이 자동으로 빌드됩니다. 이전 자습서에서와 같이 드롭다운 목록에서 Products 테이블을 선택하고 , ProductNameUnitPrice 열을 검사ProductID.

테이블 또는 뷰에서 반환할 열 선택

그림 1: 테이블 또는 뷰에서 반환할 열 선택(전체 크기 이미지를 보려면 클릭)

문에 절을 WHERESELECT 포함하려면 절 추가 WHERE 대화 상자를 표시하는 단추를 클릭합니다WHERE(그림 2 참조). 쿼리에서 반환된 결과를 제한하는 매개 변수를 SELECT 추가하려면 먼저 데이터를 필터링할 열을 선택합니다. 그런 다음 필터링에 사용할 연산자를 선택합니다(=, <, <=, >등). 마지막으로 querystring 또는 세션 상태와 같은 매개 변수 값의 원본을 선택합니다. 매개 변수를 구성한 후 추가 단추를 클릭하여 쿼리에 SELECT 포함합니다.

이 예제에서는 값이 UnitPrice $25.00보다 작거나 같은 결과만 반환해 보겠습니다. 따라서 열 드롭다운 목록에서 <를 선택하고 연산자 드롭다운 목록에서 = 를 선택합니다UnitPrice. 하드 코딩된 매개 변수 값(예: $25.00)을 사용하거나 매개 변수 값을 프로그래밍 방식으로 지정할 경우 원본 드롭다운 목록에서 없음을 선택합니다. 다음으로 값 텍스트 상자 25.00에 하드 코딩된 매개 변수 값을 입력하고 추가 단추를 클릭하여 프로세스를 완료합니다.

WHERE 절 추가 대화 상자에서 반환된 결과 제한

그림 2: 절 추가 WHERE 대화 상자에서 반환된 결과 제한(전체 크기 이미지를 보려면 클릭)

매개 변수를 추가한 후 확인을 클릭하여 데이터 원본 구성 마법사로 돌아갑니다. SELECT 이제 마법사 맨 아래에 있는 문에 라는 @UnitPrice매개 변수가 있는 WHERE 절이 포함되어야 합니다.

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

참고

절 추가 WHERE 대화 상자에서 절에 WHERE 여러 조건을 지정하면 마법사가 해당 조건을 연산자에 조인 AND 합니다. 절에 WHEREOR 포함해야 하는 경우(예: WHERE UnitPrice <= @UnitPrice OR Discontinued = 1) 사용자 지정 SQL 문 화면을 통해 문을 빌드 SELECT 해야 합니다.

SqlDataSource 구성을 완료한 다음(다음, 마침 클릭) SqlDataSource의 선언적 태그를 검사합니다. 이제 태그에는 의 매개 변수에 대한 원본을 나타내는 컬렉션이 SelectCommand포함됩니다<SelectParameters>.

<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의 Select() 메서드가 호출되면 UnitPrice 매개 변수 값(25.00)이 데이터베이스로 @UnitPrice 전송되기 전에 의 SelectCommand 매개 변수에 적용됩니다. 결과적으로 $25.00 이하의 제품만 테이블에서 반환 Products 됩니다. 이를 확인하려면 페이지에 GridView를 추가하고 이 데이터 원본에 바인딩한 다음 브라우저를 통해 페이지를 봅니다. 그림 3에서 확인할 수 있듯이 $25.00 미만이거나 같은 제품만 나열됩니다.

$25.00 미만 또는 같음 제품만 표시됩니다.

그림 3: $25.00 미만 또는 같음 제품만 표시됩니다(전체 크기 이미지를 보려면 클릭).

2단계: 사용자 지정 SQL 문에 매개 변수 추가

사용자 지정 SQL 문을 추가할 때 절을 WHERE 명시적으로 입력하거나 쿼리 작성기의 Filter 셀에 값을 지정할 수 있습니다. 이를 입증하기 위해 가격이 특정 임계값보다 작은 GridView에 해당 제품만 표시해 보겠습니다. 먼저 페이지에 TextBox를 ParameterizedQueries.aspx 추가하여 사용자로부터 이 임계값을 수집합니다. TextBox의 ID 속성을 로 MaxPrice설정합니다. 단추 웹 컨트롤을 추가하고 해당 Text 속성을 일치하는 제품 표시로 설정합니다.

다음으로 GridView를 페이지로 끌어와 스마트 태그에서 라는 ProductsFilteredByPriceDataSource새 SqlDataSource를 만들도록 선택합니다. 데이터 원본 구성 마법사에서 사용자 지정 SQL 문 또는 저장 프로시저 지정 화면(그림 4 참조)으로 이동하고 다음 쿼리를 입력합니다.

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

수동으로 또는 쿼리 작성기를 통해 쿼리를 입력한 후 다음을 클릭합니다.

매개 변수 값보다 작거나 같은 제품만 반환합니다.

그림 4: 매개 변수 값보다 작거나 같은 제품만 반환합니다(전체 크기 이미지를 보려면 클릭).

쿼리에 매개 변수가 포함되어 있으므로 마법사의 다음 화면에서 매개 변수 값의 원본을 묻는 메시지가 표시됩니다. 매개 변수 원본 드롭다운 목록에서 Control을 MaxPrice 선택하고 ControlID 드롭다운 목록에서 (TextBox 컨트롤의 ID 값)를 선택합니다. 사용자가 TextBox에 텍스트를 입력하지 않은 경우 사용할 선택적 기본값을 MaxPrice 입력할 수도 있습니다. 당분간 기본값을 입력하지 마세요.

MaxPrice TextBox의 Text 속성은 매개 변수 원본으로 사용됩니다.

그림 5: MaxPrice TextBox의 Text 속성이 매개 변수 원본으로 사용됩니다(전체 크기 이미지를 보려면 클릭).

다음, 마침을 차례로 클릭하여 데이터 원본 구성 마법사를 완료합니다. GridView, TextBox, Button 및 SqlDataSource에 대한 선언적 태그는 다음과 같습니다.

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 섹션 내의 <SelectParameters> 매개 변수는 및 PropertyName와 같은 ControlID 추가 속성을 포함하는 입니다ControlParameter. SqlDataSource의 Select() 메서드가 호출되면 는 ControlParameter 지정된 웹 컨트롤 속성에서 값을 잡고 의 해당 매개 변수에 SelectCommand할당합니다. 이 예제에서 MaxPrice s Text 속성은 매개 변수 값으로 @MaxPrice 사용됩니다.

잠시 시간을 내어 브라우저를 통해 이 페이지를 봅니다. 페이지를 처음 방문하거나 TextBox에 값이 MaxPrice 없을 때마다 GridView에 레코드가 표시되지 않습니다.

MaxPrice TextBox가 비어 있으면 레코드가 표시되지 않음

그림 6: TextBox가 비어 있을 때 MaxPrice 레코드가 표시되지 않음(전체 크기 이미지를 보려면 클릭)

제품이 표시되지 않는 이유는 기본적으로 매개 변수 값에 대한 빈 문자열이 데이터베이스 NULL 값으로 변환되기 때문입니다. 의 비교 [UnitPrice] <= NULL 는 항상 False로 평가되므로 결과가 반환되지 않습니다.

텍스트 상자에 값(예: 5.00)을 입력하고 일치하는 제품 표시 단추를 클릭합니다. 포스트백 시 SqlDataSource는 해당 매개 변수 원본 중 하나가 변경되었음을 GridView에 알립니다. 따라서 GridView는 SqlDataSource에 다시 바인딩되어 해당 제품이 $5.00 미만이거나 같은 제품을 표시합니다.

$5.00 미만 또는 같음 제품이 표시됩니다.

그림 7: $5.00 미만의 제품이 표시됩니다(전체 크기 이미지를 보려면 클릭).

처음에 모든 제품 표시

페이지를 처음 로드할 때 제품을 표시하지 않고 모든 제품을 표시할 수 있습니다. TextBox가 비어 있을 때마다 MaxPrice 모든 제품을 나열하는 한 가지 방법은 Northwind Traders에 단가가 $1,000,000를 초과하는 재고가 있을 가능성은 거의 낮기 때문에 매개 변수의 기본값을 10000000과 같이 매우 높은 값으로 설정하는 것입니다. 그러나 이 방법은 근시안적이며 다른 상황에서는 작동하지 않을 수 있습니다.

이전 자습서 - DropDownList를 사용하여 선언적 매개 변수마스터/세부 필터링 에서 비슷한 문제가 발생했습니다. 솔루션은 이 논리를 비즈니스 논리 계층에 배치하는 것이었습니다. 특히 BLL은 들어오는 값을 검사했으며, 예약된 값이거나 일부 예약된 값인 경우 NULL 호출이 모든 레코드를 반환하는 DAL 메서드로 라우팅되었습니다. 들어오는 값이 일반 필터링 값인 경우 제공된 값과 함께 매개 변수가 WHERE 있는 절을 사용하는 SQL 문을 실행하는 DAL 메서드를 호출했습니다.

아쉽게도 SqlDataSource를 사용할 때 아키텍처를 무시합니다. 대신 매개 변수 NULL 가 또는 일부 예약된 값인 경우 @MaximumPrice 모든 레코드를 지능적으로 캡처하도록 SQL 문을 사용자 지정해야 합니다. 이 연습에서는 매개 변수가 와 같-1.0으면 @MaximumPrice모든 레코드가 반환되도록 하겠습니다(-1.0 어떤 제품도 음 UnitPrice 수 값을 가질 수 없으므로 예약된 값으로 작동). 이를 위해 다음 SQL 문을 사용할 수 있습니다.

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

이 절은 WHERE 매개 변수가 와 @MaximumPrice 같으면 모든 레코드를 반환합니다.-1.0 매개 변수 값이 이 아니면 -1.0매개 변수 값보다 작거나 같은 @MaximumPrice 제품 UnitPrice 만 반환됩니다. 매개 변수의 @MaximumPrice 기본값을 -1.0로 설정하면 첫 번째 페이지 로드(또는 TextBox가 비어 있을 때마다 MaxPrice ) @MaximumPrice 에 값 -1.0 이 지정되고 모든 제품이 표시됩니다.

이제 MaxPrice TextBox가 비어 있으면 모든 제품이 표시됩니다.

그림 8: 이제 TextBox가 비어 있을 때 MaxPrice 모든 제품이 표시됩니다(전체 크기 이미지를 보려면 클릭).

이 접근 방식에 유의해야 할 몇 가지 주의 사항이 있습니다. 먼저 매개 변수의 데이터 형식이 SQL 쿼리의 사용으로 유추된다는 것을 인식합니다. 절을 WHERE 에서 로 @MaximumPrice = -1.0@MaximumPrice = -1변경하면 런타임은 매개 변수를 정수로 처리합니다. 그런 다음 TextBox를 10진수 값(예: 5.00)에 할당 MaxPrice 하려고 하면 5.00을 정수로 변환할 수 없기 때문에 오류가 발생합니다. 이 문제를 해결하려면 절에서 를 사용하는 @MaximumPrice = -1.0 지 확인하거나 개체의 Type 속성을 Decimal 로 설정합니다ControlParameter.WHERE

둘째, 를 절에 추가 OR @MaximumPrice = -1.0WHERE 하면 쿼리 엔진에서 인덱스를 사용할 수 없으므로(인덱 UnitPrice 스가 있다고 가정) 테이블 검색이 발생합니다. 테이블에 레코드가 충분히 많은 경우 성능에 Products 영향을 미칠 수 있습니다. 더 나은 방법은 이 논리를 저장 프로시저로 이동하는 것입니다. 여기서 IF 문은 모든 레코드를 반환해야 할 때 절 없이 WHERE 테이블에서 쿼리 Products 를 수행 SELECT 하거나 WHERE 절에 조건만 UnitPrice 포함되어 인덱스를 사용할 수 있도록 합니다.

3단계: 매개 변수가 있는 저장 프로시저 만들기 및 사용

저장 프로시저에는 저장 프로시저 내에 정의된 SQL 문에서 사용할 수 있는 입력 매개 변수 집합이 포함될 수 있습니다. 입력 매개 변수를 허용하는 저장 프로시저를 사용하도록 SqlDataSource를 구성할 때 이러한 매개 변수 값은 임시 SQL 문과 동일한 기술을 사용하여 지정할 수 있습니다.

SqlDataSource에서 저장 프로시저를 사용하는 방법을 설명하기 위해 라는 GetProductsByCategory매개 변수 @CategoryID 를 허용하고 열이 와 일치하는 @CategoryID제품의 모든 열을 반환하는 라는 Northwind 데이터베이스에 새 저장 프로시저를 CategoryID 만들어 보겠습니다. 저장 프로시저를 만들려면 서버 Explorer 이동하여 데이터베이스로 드릴다운합니다NORTHWND.MDF. (서버 Explorer 표시되지 않으면 보기 메뉴로 이동하여 서버 Explorer 옵션을 선택하여 표시합니다.)

데이터베이스에서 NORTHWND.MDF 저장 프로시저 폴더를 마우스 오른쪽 단추로 클릭하고 새 저장 프로시저 추가를 선택하고 다음 구문을 입력합니다.

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

저장 아이콘(또는 Ctrl+S)을 클릭하여 저장 프로시저를 저장합니다. 저장 프로시저 폴더에서 저장 프로시저를 마우스 오른쪽 단추로 클릭하고 실행을 선택하여 저장 프로시저를 테스트할 수 있습니다. 그러면 저장 프로시저의 매개 변수(@CategoryID이 instance)를 묻는 메시지가 표시되고 그 후에 결과가 출력 창에 표시됩니다.

<범위 class=@CategoryID 1사용하여 실행될 때 GetProductsByCategory 저장 프로시저" no-loc" dir="ltr" lang="en-us" data-linktype="relative-path">

그림 9: GetProductsByCategory 1을 사용하여 실행할 @CategoryID 때의 저장 프로시저(전체 크기 이미지를 보려면 클릭)

이 저장 프로시저를 사용하여 GridView의 음료 범주에 있는 모든 제품을 표시해 보겠습니다. 페이지에 새 GridView를 추가하고 라는 BeverageProductsDataSource새 SqlDataSource에 바인딩합니다. 사용자 지정 SQL 문 또는 저장 프로시저 지정 화면으로 이동하고 저장 프로시저 라디오 단추를 선택한 다음 드롭다운 목록에서 저장 프로시저를 선택합니다 GetProductsByCategory .

Drop-Down 목록에서 GetProductsByCategory 저장 프로시저를 선택합니다.

그림 10: Drop-Down 목록에서 저장 프로시저 선택 GetProductsByCategory (전체 크기 이미지를 보려면 클릭)

저장 프로시저는 입력 매개 변수()@CategoryID를 허용하므로 다음을 클릭하면 이 매개 변수 값의 원본을 지정하라는 메시지가 표시됩니다. 음료 CategoryID 는 1이므로 매개 변수 원본 드롭다운 목록을 없음으로 두고 DefaultValue 텍스트 상자에 1을 입력합니다.

Hard-Coded 값 1을 사용하여 음료 범주에서 제품 반환

그림 11: Hard-Coded 값 1을 사용하여 음료 범주에서 제품 반환(전체 크기 이미지를 보려면 클릭)

다음 선언적 태그에서 알 수 있듯이 저장 프로시저를 사용할 때 SqlDataSource의 SelectCommand 속성은 저장 프로시저의 이름으로 설정되고 SelectCommandType 속성 은 로 설정 StoredProcedure됩니다. 이는 가 임시 SQL 문이 아닌 저장 프로시저의 이름임을 나타냅니다 SelectCommand .

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

브라우저에서 페이지를 테스트합니다. 저장 프로시저가 테이블의 모든 열을 Products 반환하므로 모든 제품 필드가 표시되지만 음료 범주에 속하는 제품만 표시됩니다GetProductsByCategory. 물론 GridView의 열 편집 대화 상자에서 GridView에 표시되는 필드를 제한하거나 사용자 지정할 수 있습니다.

모든 음료가 표시됩니다.

그림 12: 모든 음료가 표시됩니다(전체 크기 이미지를 보려면 클릭).

4단계: 프로그래밍 방식으로 SqlDataSource의 Select() 문 호출

이전 자습서와 이 자습서에서 본 예제에서는 SqlDataSource 컨트롤을 GridView에 직접 바인딩했습니다. 그러나 SqlDataSource 컨트롤의 데이터는 프로그래밍 방식으로 액세스하고 코드에서 열거할 수 있습니다. 이는 데이터를 쿼리하여 검사해야 하지만 표시할 필요가 없는 경우에 특히 유용할 수 있습니다. 데이터베이스에 연결하기 위해 모든 상용구 ADO.NET 코드를 작성하고 명령을 지정하고 결과를 검색하는 대신 SqlDataSource에서 이 단조로운 코드를 처리하도록 할 수 있습니다.

프로그래밍 방식으로 SqlDataSource의 데이터 작업을 설명하기 위해 상사가 임의로 선택한 범주 및 관련 제품의 이름을 표시하는 웹 페이지를 만들라는 요청으로 사용자에게 접근했다고 상상해 보세요. 즉, 사용자가 이 페이지를 방문할 때 테이블에서 범주를 임의 Categories 로 선택하고 범주 이름을 표시한 다음 해당 범주에 속하는 제품을 나열하려고 합니다.

이렇게 하려면 두 개의 SqlDataSource 컨트롤이 테이블에서 임의의 범주 Categories 를 가져와야 하고 다른 하나는 범주의 제품을 가져와야 합니다. 이 단계에서 임의 범주 레코드를 검색하는 SqlDataSource를 빌드합니다. 5단계에서는 범주의 제품을 검색하는 SqlDataSource 만들기를 살펴봅니다.

먼저 SqlDataSource ParameterizedQueries.aspx 를 에 추가하고 를 IDRandomCategoryDataSource설정합니다. 다음 SQL 쿼리를 사용할 수 있도록 구성합니다.

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

ORDER BY NEWID()는 임의 순서로 정렬된 레코드를 반환합니다(레코드를 임의로 정렬하는 데 사용 NEWID()참조). SELECT TOP 1 는 결과 집합에서 첫 번째 레코드를 반환합니다. 이 쿼리는 임의 CategoryID 로 선택된 단일 범주에서 및 CategoryName 열 값을 반환합니다.

범주 값을 CategoryName 표시하려면 페이지에 레이블 웹 컨트롤을 추가하고 해당 ID 속성을 로 설정하고 해당 Text 속성을 CategoryNameLabel지웁니다. SqlDataSource 컨트롤에서 데이터를 프로그래밍 방식으로 검색하려면 해당 Select() 메서드를 호출해야 합니다. 메서드는 Select() 반환되기 전에 데이터를 메시지로 전송하는 방법을 지정하는 형식DataSourceSelectArguments의 단일 입력 매개 변수를 예상합니다. 여기에는 데이터 정렬 및 필터링에 대한 지침이 포함될 수 있으며 SqlDataSource 컨트롤에서 데이터를 정렬하거나 페이징할 때 데이터 웹 컨트롤에서 사용됩니다. 하지만 이 예제에서는 반환되기 전에 데이터를 수정할 필요가 없으므로 개체를 DataSourceSelectArguments.Empty 전달합니다.

메서드는 Select() 를 구현하는 개체를 반환합니다 IEnumerable. 반환되는 정확한 형식은 SqlDataSource 컨트롤의 DataSourceMode 속성 값에 따라 달라집니다. 이전 자습서에서 설명한 대로 이 속성을 또는 DataReaderDataSet 으로 설정할 수 있습니다. 로 DataSet설정하면 메서드는 Select()DataView 개체를 반환하고 로 DataReader설정하면 를 구현하는 개체를 반환합니다 IDataReader. RandomCategoryDataSource SqlDataSource의 속성이 DataSourceMode (기본값)로 설정되어 DataSet 있으므로 DataView 개체로 작업합니다.

다음 코드에서는 SqlDataSource에서 RandomCategoryDataSource DataView로 레코드를 검색하는 방법과 첫 번째 DataView 행에서 열 값을 읽 CategoryName 는 방법을 보여 줍니다.

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles Me.Load
    ' Get the data from the SqlDataSource as a DataView
    Dim randomCategoryView As DataView = CType _
        (RandomCategoryDataSource.Select(DataSourceSelectArguments.Empty), DataView)
    If randomCategoryView.Count > 0 Then
        ' Assign the CategoryName value to the Label
        CategoryNameLabel.Text = String.Format( _
            "Here are Products in the {0} Category...", _
            randomCategoryView(0)("CategoryName").ToString())
    End If
End Sub

randomCategoryView(0) 는 DataView의 첫 번째 DataRowView 를 반환합니다. randomCategoryView(0)("CategoryName") 는 이 첫 번째 행에 CategoryName 있는 열의 값을 반환합니다. DataView는 느슨하게 형식화되어 있습니다. 특정 열 값을 참조하려면 열 이름을 문자열(이 경우 CategoryName)으로 전달해야 합니다. 그림 13은 페이지를 볼 때 에 CategoryNameLabel 표시되는 메시지를 보여줍니다. 물론 표시되는 실제 범주 이름은 페이지를 방문할 때마다 SqlDataSource에서 임의 RandomCategoryDataSource 로 선택됩니다(포스트백 포함).

임의로 선택한 범주의 이름이 표시됩니다.

그림 13: 임의로 선택한 범주의 이름이 표시됩니다(전체 크기 이미지를 보려면 클릭).

참고

SqlDataSource 컨트롤의 DataSourceMode 속성이 로 설정된 DataReader경우 메서드의 Select() 반환 값을 로 캐스팅 IDataReader해야 했습니다. 첫 번째 행에서 CategoryName 열 값을 읽으려면 다음과 같은 코드를 사용합니다.

If randomCategoryReader.Read() Then
   Dim categoryName as String = randomCategoryReader("CategoryName').ToString()
   ...
End If

SqlDataSource에서 범주를 임의로 선택하면 범주의 제품을 나열하는 GridView를 추가할 준비가 된 것입니다.

참고

레이블 웹 컨트롤을 사용하여 범주 이름을 표시하는 대신 페이지에 FormView 또는 DetailsView를 추가하여 SqlDataSource에 바인딩할 수 있습니다. 그러나 Label을 사용하면 SqlDataSource 문을 Select() 프로그래밍 방식으로 호출하고 코드에서 결과 데이터를 사용하는 방법을 탐색할 수 있습니다.

5단계: 프로그래밍 방식으로 매개 변수 값 할당

이 자습서에서 지금까지 살펴본 모든 예제에서는 하드 코딩된 매개 변수 값 또는 미리 정의된 매개 변수 원본(querystring 값, 페이지의 웹 컨트롤 등) 중 하나에서 가져온 매개 변수 값을 사용했습니다. 그러나 SqlDataSource 컨트롤의 매개 변수를 프로그래밍 방식으로 설정할 수도 있습니다. 현재 예제를 완료하려면 지정된 범주에 속하는 모든 제품을 반환하는 SqlDataSource가 필요합니다. 이 SqlDataSource에는 이벤트 처리기에서 CategoryID SqlDataSource가 반환한 RandomCategoryDataSource 열 값에 CategoryID 따라 값을 설정해야 하는 매개 변수가 Page_Load 있습니다.

먼저 페이지에 GridView를 추가하고 라는 ProductsByCategoryDataSource새 SqlDataSource에 바인딩합니다. 3단계에서와 마찬가지로 저장 프로시저를 호출할 수 있도록 SqlDataSource를 GetProductsByCategory 구성합니다. 매개 변수 원본 드롭다운 목록을 없음으로 설정하지만 이 기본값을 프로그래밍 방식으로 설정하므로 기본값을 입력하지 마세요.

매개 변수 원본이 없음으로 설정된 데이터 원본 구성 창을 보여 주는 스크린샷

그림 14: 매개 변수 원본 또는 기본값 지정 안 함(전체 크기 이미지를 보려면 클릭)

SqlDataSource 마법사를 완료한 후 결과 선언적 태그는 다음과 유사하게 표시됩니다.

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

이벤트 처리기에서 프로그래밍 방식으로 매개 변수의 CategoryID 를 할당 DefaultValuePage_Load 수 있습니다.

' Assign the ProductsByCategoryDataSource's
' CategoryID parameter's DefaultValue property
ProductsByCategoryDataSource.SelectParameters("CategoryID").DefaultValue = _
    randomCategoryView(0)("CategoryID").ToString()

이 추가를 통해 페이지에는 임의로 선택된 범주와 연결된 제품을 보여 주는 GridView가 포함됩니다.

임의로 선택한 범주 페이지를 보여 주는 스크린샷.

그림 15: 매개 변수 원본 또는 기본값 지정 안 함(전체 크기 이미지를 보려면 클릭)

요약

SqlDataSource를 사용하면 페이지 개발자가 매개 변수 값을 하드 코딩하거나, 미리 정의된 매개 변수 원본에서 가져오거나, 프로그래밍 방식으로 할당할 수 있는 매개 변수가 있는 쿼리를 정의할 수 있습니다. 이 자습서에서는 임시 SQL 쿼리와 저장 프로시저 모두에 대해 데이터 원본 구성 마법사에서 매개 변수가 있는 쿼리를 만드는 방법을 알아보았습니다. 또한 하드 코딩된 매개 변수 원본, 웹 컨트롤을 매개 변수 원본으로 사용하고 프로그래밍 방식으로 매개 변수 값을 지정하는 방법도 살펴보았습니다.

ObjectDataSource와 마찬가지로 SqlDataSource는 기본 데이터를 수정하는 기능도 제공합니다. 다음 자습서에서는 SqlDataSource를 사용하여 , UPDATEDELETE 문을 정의하는 INSERT방법을 살펴보겠습니다. 이러한 문이 추가되면 GridView, DetailsView 및 FormView 컨트롤에 내재된 기본 제공 삽입, 편집 및 삭제 기능을 활용할 수 있습니다.

행복한 프로그래밍!

저자 정보

7개의 ASP/ASP.NET 책의 저자이자 4GuysFromRolla.com 창립자인 Scott Mitchell은 1998년부터 Microsoft 웹 기술로 작업해 왔습니다. Scott은 독립 컨설턴트, 트레이너 및 작가로 일합니다. 그의 최신 책은 샘스 티치 유어셀프 ASP.NET 24시간 만에 2.0입니다. 그는 에서mitchell@4GuysFromRolla.com 또는 에서 찾을 http://ScottOnWriting.NET수있는 자신의 블로그를 통해 도달 할 수 있습니다.

특별 감사

이 자습서 시리즈는 많은 유용한 검토자가 검토했습니다. 이 자습서의 수석 검토자는 Scott Clyde, Randell Schmidt 및 Ken Pespisa였습니다. 예정된 MSDN 문서를 검토하는 데 관심이 있으신가요? 그렇다면 에 줄을 놓습니다 mitchell@4GuysFromRolla.com.