작성자: 스콧 미첼
이 자습서에서는 SqlDataSource 컨트롤을 계속 살펴보고 매개 변수가 있는 쿼리를 정의하는 방법을 배웁니다. 매개 변수는 선언적으로나 프로그래밍 방식으로 지정할 수 있으며 쿼리 문자열, 세션 상태, 기타 컨트롤 등과 같은 여러 위치에서 가져올 수 있습니다.
소개
이전 자습서에서는 SqlDataSource 컨트롤을 사용하여 데이터베이스에서 직접 데이터를 검색하는 방법을 살펴보았습니다. Configure Data Source 마법사를 사용하여 데이터베이스를 선택한 다음 다음 중 하나를 선택할 수 있습니다. 사용자 정의 SQL 문을 입력하십시오. 또는 저장 프로시저를 사용합니다. 테이블 또는 뷰에서 열을 선택하든 사용자 지정 SQL 문을 입력하든 관계없이 SqlDataSource 컨트롤의 SelectCommand
속성에는 결과 임시 SQL SELECT
문이 할당되며, SqlDataSource s 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는 for 문과 SELECT
, INSERT
, 및 UPDATE
문 모두에 대해 DELETE
매개 변수가 있는 쿼리를 지원합니다. 또한 매개 변수 값은 쿼리 문자열, 세션 상태, 페이지의 컨트롤 등 다양한 소스에서 자동으로 가져오거나 프로그래밍 방식으로 할당할 수 있습니다. 이 자습서에서는 매개 변수가 있는 쿼리를 정의하는 방법과 매개 변수 값을 선언적으로 그리고 프로그래밍 방식으로 지정하는 방법을 살펴보겠습니다.
비고
이전 자습서에서는 처음 46개 자습서에서 선택한 도구인 ObjectDataSource를 SqlDataSource와 비교하여 개념적 유사성을 확인했습니다. 이러한 유사성은 매개 변수에도 적용됩니다. ObjectDataSource의 매개 변수는 비즈니스 논리 계층의 메서드에 대한 입력 매개 변수에 매핑됩니다. SqlDataSource를 사용하면 매개 변수가 SQL 쿼리 내에서 직접 정의됩니다. 두 컨트롤 모두 , Select()
Insert()
, Update()
및 Delete()
메서드에 대한 매개 변수 컬렉션을 가지고 있으며, 둘 다 이러한 매개 변수 값을 미리 정의된 소스(쿼리 문자열 값, 세션 변수 등)에서 채우거나 프로그래밍 방식으로 할당할 수 있습니다.
매개 변수가 있는 쿼리 만들기
SqlDataSource 컨트롤의 데이터 소스 구성 마법사는 데이터베이스 레코드를 검색하기 위해 실행할 명령을 정의하는 세 가지 방법을 제공합니다.
- 기존 테이블 또는 뷰에서 열을 선택하여,
- 사용자 지정 SQL 문을 입력하거나
- 저장 프로시저를 선택하여
기존 테이블 또는 뷰에서 열을 선택할 때는 Add Clause(절 추가WHERE
) 대화 상자를 통해 절에 WHERE
대한 매개 변수를 지정해야 합니다. 그러나 사용자 지정 SQL 문을 만들 때 매개 변수를 절에 WHERE
직접 입력할 수 있습니다(각 매개 변수를 나타내는 데 사용 @parameterName
). 저장 프로시저는 하나 이상의 SQL 문으로 구성되며 이러한 문은 매개 변수화될 수 있습니다. 그러나 SQL 문에 사용된 매개 변수는 저장 프로시저에 입력 매개 변수로 전달되어야 합니다.
매개 변수가 있는 쿼리를 만드는 것은 SqlDataSource s SelectCommand
가 지정되는 방식에 따라 달라지므로 세 가지 방법을 모두 살펴보겠습니다. 시작하려면 폴더에서 페이지를 ParameterizedQueries.aspx
열고 SqlDataSource
도구 상자에서 디자이너로 SqlDataSource 컨트롤을 끌어 온 다음 .ID
Products25BucksAndUnderDataSource
다음으로, 컨트롤의 스마트 태그에서 Configure Data Source 링크를 클릭합니다. 사용할 데이터베이스를 선택하고(NORTHWINDConnectionString
)를 클릭합니다. 다음을 클릭합니다.
1단계: 테이블 또는 뷰에서 열을 선택할 때 WHERE 절 추가Step 1: Adding a WHERE Clause when Picking the columns from a Table or View
SqlDataSource 컨트롤을 사용하여 데이터베이스에서 반환할 데이터를 선택할 때 데이터 소스 구성 마법사를 사용하면 기존 테이블이나 뷰에서 반환할 열을 간단히 선택할 수 있습니다(그림 1 참조). 이렇게 하면 SqlDataSource s SELECT
메서드가 호출될 때 데이터베이스로 전송되는 SQL Select()
문이 자동으로 빌드됩니다. 이전 자습서에서와 마찬가지로 드롭다운 목록에서 Products 테이블을 선택하고 , ProductID
, 및 ProductName
열을 확인합니다UnitPrice
.
그림 1: 테이블 또는 뷰에서 반환할 열 선택(전체 크기 이미지를 보려면 클릭)
문에 절을 포함 WHERE
하려면 단추를 클릭하면 SELECT
Add Clause(절 추가WHERE
) 대화 상자가 표시됩니다(그림 2 WHERE
참조). 쿼리에서 SELECT
반환되는 결과를 제한하는 매개 변수를 추가하려면 먼저 데이터를 필터링하는 데 사용할 열을 선택합니다. 그런 다음 필터링에 사용할 연산자(=, <, <=, >등)를 선택합니다. 마지막으로, 매개 변수 s 값의 원본(예: 쿼리 문자열 또는 세션 상태)을 선택합니다. 매개 변수를 구성한 후 Add 버튼을 클릭하여 쿼리에 SELECT
포함합니다.
이 예에서는 값이 $25.00 이하인 결과 UnitPrice
만 반환하겠습니다. 따라서 Column(열) 드롭다운 목록에서 UnitPrice
선택하고 Operator(연산자) 드롭다운 목록에서 =를 선택합니다<. 하드 코드된 매개 변수 값(예: $25.00)을 사용하거나 매개 변수 값을 프로그래밍 방식으로 지정해야 하는 경우 소스 드롭다운 목록에서 없음을 선택합니다. 그런 다음 값 텍스트 상자 25.00에 하드 코딩된 매개 변수 값을 입력하고 추가 버튼을 클릭하여 프로세스를 완료합니다.
그림 2: 절 추가 WHERE
대화 상자에서 반환된 결과 제한(전체 크기 이미지를 보려면 클릭)
매개 변수를 추가한 후 확인을 클릭하여 데이터 원본 구성 마법사로 돌아갑니다. 이제 마법사의 맨 아래에 있는 문에 SELECT
다음과 같은 WHERE
매개 변수가 있는 절이 포함되어야 @UnitPrice
합니다.
SELECT [ProductID], [ProductName], [UnitPrice]
FROM [Products]
WHERE ([UnitPrice] <= @UnitPrice)
비고
Add Clause(절 추가WHERE
) 대화 상자에서 절에 WHERE
여러 조건을 지정하면 마법사가 연산자를 사용하여 조건을 조인합니다AND
. 절에 OR
(WHERE
예 : WHERE UnitPrice <= @UnitPrice OR Discontinued = 1
)을 포함해야하는 경우 사용자 지정 SQL 문 화면을 통해 문을 작성 SELECT
해야합니다.
SqlDataSource 구성을 완료한 다음(다음, 마침을 클릭) SqlDataSource의 선언적 태그를 검사합니다. 이제 마크업에 컬렉션이 <SelectParameters>
포함되며, 이 컬렉션은 의 매개 변수에 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)이 데이터베이스로 전송되기 전에 매개 변수에 적용됩니다.@UnitPrice
SelectCommand
최종 결과는 $25.00 이하인 제품만 테이블에서 반환됩니다 Products
. 이를 확인하려면 페이지에 GridView를 추가하고, 이 데이터 소스에 바인딩한 다음, 브라우저를 통해 페이지를 봅니다. 그림 3에서 확인할 수 있듯이 $25.00 이하이거나 같은 제품만 표시되어야 합니다.
그림 3: $25.00 이하인 제품만 표시됩니다(전체 크기 이미지를 보려면 클릭).
2단계: 사용자 지정 SQL 문에 매개 변수 추가
사용자 지정 SQL 문을 추가할 때 절을 명시적으로 입력하거나 WHERE
쿼리 빌더의 필터 셀에 값을 지정할 수 있습니다. 이를 보여주기 위해 가격이 특정 임계값보다 작은 GridView에 해당 제품만 표시해 보겠습니다. 먼저 페이지에 TextBox ParameterizedQueries.aspx
를 추가하여 사용자로부터 이 임계값을 수집합니다. TextBox s ID
속성을 MaxPrice
로 설정합니다. Button 웹 컨트롤을 추가하고 해당 Text
속성을 Display Matching Products로 설정합니다.
그런 다음 GridView를 페이지로 끌어 스마트 태그에서 라는 ProductsFilteredByPriceDataSource
새 SqlDataSource를 만들도록 선택합니다. Configure Data Source 마법사에서 Specify a custom SQL statement or stored procedure(사용자 지정 SQL 문 또는 저장 프로시저 지정) 화면(그림 4 참조)으로 진행하여 다음 쿼리를 입력합니다.
SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice
쿼리를 입력한 후(수동으로 또는 Query Builder를 통해) Next(다음)를 클릭합니다.
그림 4: 매개 변수 값보다 작거나 같은 제품만 반환(전체 크기 이미지를 보려면 클릭)
쿼리에 매개 변수가 포함되어 있으므로 마법사의 다음 화면에서 매개 변수 값의 원본을 입력하라는 메시지가 표시됩니다. 매개 변수 원본 드롭다운 목록에서 컨트롤을 선택하고 MaxPrice
ControlID 드롭다운 목록에서 (TextBox 컨트롤 값 ID
)을 선택합니다. 사용자가 TextBox에 텍스트를 입력하지 않은 경우에 사용할 선택적 기본값을 입력할 수도 있습니다 MaxPrice
. 당분간은 기본값을 입력하지 마십시오.
그림 5: MaxPrice
TextBox s Text
속성이 매개 변수 원본으로 사용됩니다(전체 크기 이미지를 보려면 클릭).
Next(다음)를 클릭한 다음 Finish(마침)를 클릭하여 Configure Data Source(데이터 소스 구성) 마법사를 완료합니다. 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 s <SelectParameters>
섹션 내의 매개 변수는 및 ControlParameter
와 같은 ControlID
추가 속성을 포함하는 a PropertyName
입니다. SqlDataSource s Select()
메서드가 호출되면 지정된 ControlParameter
웹 컨트롤 속성에서 값을 가져와 의 SelectCommand
해당 매개 변수에 할당합니다. 이 예제에서는 MaxPrice
s Text 속성이 매개 변수 값으로 사용됩니다 @MaxPrice
.
잠시 시간을 내어 브라우저를 통해 이 페이지를 보십시오. 페이지를 처음 방문하거나 TextBox에 MaxPrice
값이 없을 때마다 GridView에 레코드가 표시되지 않습니다.
그림 6: TextBox가 MaxPrice
비어 있을 때 레코드가 표시되지 않음(전체 크기 이미지를 보려면 클릭)
제품이 표시되지 않는 이유는 기본적으로 매개 변수 값에 대한 빈 문자열이 데이터베이스 NULL
값으로 변환되기 때문입니다. 의 [UnitPrice] <= NULL
비교는 항상 False로 평가되므로 결과가 반환되지 않습니다.
텍스트 상자에 5.00과 같은 값을 입력하고 Display Matching Products 버튼을 클릭합니다. 포스트백 시 SqlDataSource는 GridView에 매개 변수 원본 중 하나가 변경되었음을 알립니다. 결과적으로 GridView는 SqlDataSource에 다시 바인딩되어 해당 제품을 $5.00 이하로 표시합니다.
그림 7: $5.00 이하인 제품이 표시됨(전체 크기 이미지를 보려면 클릭)
처음에 모든 제품 표시
페이지가 처음 로드될 때 제품을 표시하지 않는 대신 모든 제품을 표시할 수 있습니다. TextBox가 MaxPrice
비어 있을 때마다 모든 제품을 나열하는 한 가지 방법은 Northwind Traders가 단가가 $1,000,000를 초과하는 재고를 가질 가능성이 낮기 때문에 매개 변수의 기본값을 1000000과 같은 미친 듯이 높은 값으로 설정하는 것입니다. 그러나 이 접근 방식은 근시안적이며 다른 상황에서는 작동하지 않을 수 있습니다.
이전 자습서 - 선언적 매개 변수 및 DropDownList를 사용한 마스터/세부 정보 필터링 에서 비슷한 문제에 직면했습니다. 우리의 해결책은 이 논리를 Business Logic Layer에 넣는 것이었습니다. 특히 BLL은 들어오는 값을 검사하고, 이 값이 예약된 값이거나 NULL
예약된 값인 경우 호출이 모든 레코드를 반환하는 DAL 메서드로 라우팅되었습니다. 들어오는 값이 일반 필터링 값인 경우 제공된 값과 함께 매개 변수가 있는 WHERE
절을 사용하는 SQL 문을 실행하는 DAL 메서드가 호출되었습니다.
불행히도 SqlDataSource를 사용할 때 아키텍처를 우회합니다. 대신 매개변수가 또는 예약된 값인 @MaximumPrice
경우 NULL
모든 레코드를 지능적으로 가져오도록 SQL 문을 사용자 정의해야 합니다. 이 연습에서는 매개 변수가 와 같@MaximumPrice
으면 -1.0
모든 레코드가 반환되도록 합니다(-1.0
어떤 제품도 음수 UnitPrice
값을 가질 수 없으므로 예약된 값으로 작동). 이를 위해 다음 SQL 문을 사용할 수 있습니다.
SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice OR @MaximumPrice = -1.0
이 WHERE
절은 매개 변수가 와 같을 @MaximumPrice
경우 -1.0
레코드를 반환합니다. 매개 변수 값이 not -1.0
인 경우 매개 변수 값보다 UnitPrice
작거나 같은 제품 @MaximumPrice
만 반환됩니다. 매개 변수의 @MaximumPrice
기본값을 -1.0
로 설정하면 첫 번째 페이지로드시 (또는 TextBox가 MaxPrice
비어있을 때마다) @MaximumPrice
의 값이 -1.0
지정되고 모든 제품이 표시됩니다.
그림 8: 이제 TextBox가 MaxPrice
비어 있을 때 모든 제품이 표시됩니다(전체 크기 이미지를 보려면 클릭).
이 접근 방식에서 주의해야 할 몇 가지 주의 사항이 있습니다. 먼저 매개 변수 s 데이터 형식이 SQL 쿼리의 사용에 의해 유추된다는 것을 알고 있습니다. 절을 에서 WHERE
로 @MaximumPrice = -1.0
변경하면 @MaximumPrice = -1
런타임은 매개 변수를 정수로 처리합니다. 그런 다음 TextBox를 MaxPrice
10진수 값(예: 5.00 )에 할당하려고 하면 5.00을 정수로 변환할 수 없기 때문에 오류가 발생합니다. 이 문제를 해결하려면 절에서 @MaximumPrice = -1.0
사용 WHERE
하는지 확인하거나 object s ControlParameter
속성을 Decimal 로 설정하는 Type
것이 좋습니다.
둘째, 절에 OR @MaximumPrice = -1.0
를 WHERE
추가하면 쿼리 엔진이 인덱스가 UnitPrice
있다고 가정할 때 인덱스를 사용할 수 없으므로 테이블 스캔이 발생합니다. 이는 테이블에 충분히 많은 수의 레코드가 있는 경우 성능에 영향을 줄 수 있습니다 Products
. 더 나은 접근 방식은 이 논리를 저장 프로시저 IF
로 이동하여 모든 레코드를 반환해야 할 때 절 없이 SELECT
테이블에서 쿼리를 Products
수행 WHERE
하거나 WHERE
절에 조건만 UnitPrice
포함된 쿼리를 수행하여 인덱스를 사용할 수 있도록 하는 것입니다.
3단계: 매개 변수가 있는 저장 프로시저 만들기 및 사용
저장 프로시저에는 저장 프로시저 내에 정의된 SQL 문에서 사용할 수 있는 입력 매개 변수 집합이 포함될 수 있습니다. 입력 매개 변수를 허용하는 저장 프로시저를 사용하도록 SqlDataSource를 구성할 때 임시 SQL 문과 동일한 기술을 사용하여 이러한 매개 변수 값을 지정할 수 있습니다.
SqlDataSource에서 저장 프로시저를 사용하는 방법을 설명하기 위해 Northwind 데이터베이스에 GetProductsByCategory
라는 새 저장 프로시저를 만들어 보겠습니다.이 저장 프로시저는 명명된 @CategoryID
매개 변수를 수락하고 열이 일치하는 CategoryID
제품의 @CategoryID
모든 열을 반환합니다. 저장 프로시저를 만들려면 서버 탐색기로 이동하여 데이터베이스로 드릴다운합니다 NORTHWND.MDF
. (서버 탐색기가 표시되지 않으면 보기 메뉴로 이동하여 서버 탐색기 옵션을 선택하여 불러옵니다.)
NORTHWND.MDF
데이터베이스에서 Stored Procedures 폴더를 마우스 오른쪽 버튼으로 클릭하고 Add New Stored Procedure를 선택한 후 다음 구문을 입력합니다.
CREATE PROCEDURE dbo.GetProductsByCategory
(
@CategoryID int
)
AS
SELECT *
FROM Products
WHERE CategoryID = @CategoryID
저장 아이콘(또는 Ctrl+S)을 클릭하여 저장 프로시저를 저장합니다. Stored Procedures(저장 프로시저) 폴더에서 저장 프로시저를 마우스 오른쪽 단추로 클릭하고 Execute(실행)를 선택하여 저장할 수 있습니다. 그러면 저장 프로시저의 매개 변수(@CategoryID
이 경우)를 묻는 메시지가 표시되며, 그 후에 결과가 출력 창에 표시됩니다.
그림 9: GetProductsByCategory
1로 @CategoryID
실행된 저장 프로시저(전체 크기 이미지를 보려면 클릭)
이 저장 프로시저를 사용하여 GridView의 음료 범주에 있는 모든 제품을 표시해 보겠습니다. 페이지에 새 GridView를 추가하고 라는 새 BeverageProductsDataSource
SqlDataSource에 바인딩합니다. 사용자 지정 SQL 문 또는 저장 프로시저 지정 화면으로 계속 진행하고, 저장 프로시저 라디오 단추를 선택하고, 드롭다운 목록에서 저장 프로시저를 GetProductsByCategory
선택합니다.
그림 10: Drop-Down 목록에서 저장 프로시저 선택 GetProductsByCategory
(전체 크기 이미지를 보려면 클릭)
저장 프로시저는 입력 매개 변수()@CategoryID
를 허용하므로 다음을 클릭하면 이 매개 변수 값의 원본을 지정하라는 메시지가 표시됩니다. Beverages CategoryID
는 1이므로 매개 변수 소스 드롭다운 목록을 None으로 두고 DefaultValue 텍스트 상자에 1을 입력합니다.
그림 11: Hard-Coded 값 1을 사용하여 음료 범주의 제품을 반환합니다(전체 크기 이미지를 보려면 클릭).
다음 선언적 태그에서 볼 수 있듯이 저장 프로시저를 사용할 때 SqlDataSource s SelectCommand
속성은 저장 프로시저의 이름으로 설정되고 SelectCommandType
속성은 임시 SQL 문이 아닌 저장 프로시저의 이름임을 StoredProcedure
나타내는 로 설정됩니다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>
브라우저에서 페이지를 테스트합니다. Beverages 범주에 속하는 제품만 표시되지만 저장 프로시저가 테이블의 모든 열을 GetProductsByCategory
반환하기 때문에 Products
제품 필드가 표시됩니다. 물론 GridView의 열 편집 대화 상자에서 GridView에 표시되는 필드를 제한하거나 사용자 지정할 수 있습니다.
그림 12: 모든 음료가 표시됩니다(전체 크기 이미지를 보려면 클릭).
4단계: 프로그래밍 방식으로 SqlDataSource의 select() 문 호출
이전 자습서와 지금까지 이 자습서에서 본 예제에서는 SqlDataSource 컨트롤을 GridView에 직접 바인딩했습니다. 그러나 SqlDataSource 컨트롤의 데이터는 프로그래밍 방식으로 액세스하고 코드에서 열거할 수 있습니다. 이는 데이터를 쿼리하여 검사해야 하지만 표시할 필요가 없는 경우에 특히 유용할 수 있습니다. 데이터베이스에 연결하고, 명령을 지정하고, 결과를 검색하기 위해 모든 상용구 ADO.NET 코드를 작성할 필요 없이 SqlDataSource에서 이 단조로운 코드를 처리하도록 할 수 있습니다.
프로그래밍 방식으로 SqlDataSource의 데이터를 사용하는 방법을 설명하기 위해 상사가 임의로 선택한 범주 및 관련 제품의 이름을 표시하는 웹 페이지를 만들라는 요청으로 접근했다고 상상해 보십시오. 즉, 사용자가 이 페이지를 방문할 때 테이블에서 범주 Categories
를 임의로 선택하고 범주 이름을 표시한 다음 해당 범주에 속하는 제품을 나열하려고 합니다.
이를 위해서는 두 개의 SqlDataSource 컨트롤이 필요한데, Categories
하나는 테이블에서 임의의 범주를 가져오고 다른 하나는 범주 제품을 가져와야 합니다. 이 단계에서 임의의 범주 레코드를 검색하는 SqlDataSource를 빌드합니다. 5단계에서는 범주 s 제품을 검색하는 SqlDataSource를 만드는 방법을 살펴봅니다.
먼저 SqlDataSource ParameterizedQueries.aspx
ID
RandomCategoryDataSource
를 추가하고 . 다음 SQL 쿼리를 사용하도록 구성합니다.
SELECT TOP 1 CategoryID, CategoryName
FROM Categories
ORDER BY NEWID()
ORDER BY NEWID()
무작위 순서로 정렬된 레코드를 반환합니다( Using NEWID()
to Randomly Sort Records 참조).
SELECT TOP 1
결과 집합에서 첫 번째 레코드를 반환합니다. 이 쿼리를 함께 사용하면 임의로 선택된 단일 범주에서 및 CategoryID
열 값이 반환됩니다CategoryName
.
범주 값을 CategoryName
표시하려면 페이지에 레이블 웹 컨트롤을 추가하고, 해당 ID
속성을 CategoryNameLabel
로 설정하고, 해당 Text
속성을 지웁니다. 프로그래밍 방식으로 SqlDataSource 컨트롤에서 데이터를 검색하려면 해당 Select()
메서드를 호출해야 합니다. 이 Select()
메서드 에는 데이터가 반환되기 전에 메시지를 보내는 방법을 지정하는 유형의 DataSourceSelectArguments
단일 입력 매개 변수가 필요합니다. 여기에는 데이터 정렬 및 필터링에 대한 지침이 포함될 수 있으며, SqlDataSource 컨트롤에서 데이터를 정렬하거나 페이징할 때 데이터 웹 컨트롤에서 사용됩니다. 그러나 이 예에서는 반환되기 전에 데이터를 수정할 필요가 없으므로 객체를 전달합니다 DataSourceSelectArguments.Empty
.
이 Select()
메서드는 를 구현하는 IEnumerable
개체를 반환합니다. 반환되는 정확한 형식은 SqlDataSource 컨트롤의 DataSourceMode
속성 값에 따라 달라집니다. 이전 자습서에서 설명한 것처럼 이 속성은 또는 DataSet
의 값으로 DataReader
설정할 수 있습니다. 로 DataSet
설정하면 Select()
객체가 반환되고, 로 설정하면 DataReader
를 구현하는 IDataReader
객체가 반환됩니다. SqlDataSource RandomCategoryDataSource
의 DataSourceMode
속성은 (기본값)으로 DataSet
설정되어 있으므로 DataView 개체로 작업합니다.
다음 코드에서는 SqlDataSource에서 RandomCategoryDataSource
DataView로 레코드를 검색하는 방법과 첫 번째 DataView 행에서 열 값을 읽는 CategoryName
방법을 보여 줍니다.
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]["CategoryName"]
이 첫 번째 행에 있는 CategoryName
열의 값을 반환합니다. DataView는 느슨한 형식입니다. 특정 열 값을 참조하려면 열 이름을 문자열(이 경우 CategoryName)로 전달해야 합니다. 그림 13은 페이지를 볼 때 표시되는 CategoryNameLabel
메시지를 보여줍니다. 물론 표시되는 실제 범주 이름은 페이지를 방문할 때마다(포스트백 포함) SqlDataSource에 의해 RandomCategoryDataSource
임의로 선택됩니다.
그림 13: 임의로 선택한 범주 이름이 표시됩니다(전체 크기 이미지를 보려면 클릭).
비고
SqlDataSource 컨트롤의 DataSourceMode
속성이 로 설정된 DataReader
경우 메서드의 Select()
반환 값을 로 캐스팅 IDataReader
해야 합니다. 첫 번째 행에서 CategoryName
열 값을 읽으려면 다음과 같은 코드를 사용합니다.
if (randomCategoryReader.Read())
{
string categoryName = randomCategoryReader["CategoryName"].ToString();
...
}
SqlDataSource가 임의로 범주를 선택하면 범주 제품을 나열하는 GridView를 추가할 준비가 되었습니다.
비고
레이블 웹 컨트롤을 사용하여 범주 이름을 표시하는 대신 페이지에 FormView 또는 DetailsView를 추가하여 SqlDataSource에 바인딩할 수 있습니다. 그러나 Label을 사용하면 프로그래밍 방식으로 SqlDataSource s Select()
문을 호출하고 결과 데이터를 코드로 작업하는 방법을 탐색할 수 있습니다.
5단계: 프로그래밍 방식으로 매개 변수 값 할당
이 자습서에서 지금까지 살펴본 모든 예제에서는 하드 코딩된 매개 변수 값 또는 미리 정의된 매개 변수 소스(쿼리 문자열 값, 페이지의 웹 컨트롤 등) 중 하나에서 가져온 매개 변수 값을 사용했습니다. 그러나 SqlDataSource 컨트롤의 매개 변수를 프로그래밍 방식으로 설정할 수도 있습니다. 현재 예제를 완료하려면 지정된 범주에 속하는 모든 제품을 반환하는 SqlDataSource가 필요합니다. 이 SqlDataSource에는 CategoryID
이벤트 처리기에서 SqlDataSource가 반환한 CategoryID
열 값에 따라 RandomCategoryDataSource
값을 설정해야 하는 매개 변수가 Page_Load
있습니다.
먼저 페이지에 GridView를 추가하고 라는 ProductsByCategoryDataSource
새 SqlDataSource에 바인딩합니다. 3단계에서 했던 것처럼 저장 프로시저를 호출하도록 SqlDataSource를 GetProductsByCategory
구성합니다. Parameter source 드롭다운 목록을 None으로 설정된 상태로 두되, 이 기본값을 프로그래밍 방식으로 설정하므로 기본값을 입력하지 마십시오.
그림 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>
이벤트 핸들러에서 프로그래밍 방식으로 매개 변수를 할당할 DefaultValue
CategoryID
수 있습니다.Page_Load
// Assign the ProductsByCategoryDataSource's
// CategoryID parameter's DefaultValue property
ProductsByCategoryDataSource.SelectParameters["CategoryID"].DefaultValue =
randomCategoryView[0]["CategoryID"].ToString();
이 추가를 통해 페이지에는 임의로 선택한 범주와 연결된 제품을 표시하는 GridView가 포함됩니다.
그림 15: 매개 변수 원본 또는 기본값을 지정하지 않음(전체 크기 이미지를 보려면 클릭)
요약
페이지 개발자는 SqlDataSource를 사용하여 매개 변수 값을 하드 코딩하거나, 미리 정의된 매개 변수 소스에서 끌어오거나, 프로그래밍 방식으로 할당할 수 있는 매개 변수가 있는 쿼리를 정의할 수 있습니다. 이 자습서에서는 Configure Data Source 마법사에서 임시 SQL 쿼리와 저장 프로시저 모두에 대해 매개 변수가 있는 쿼리를 만드는 방법을 살펴보았습니다. 또한 하드 코딩된 매개 변수 소스, 웹 컨트롤을 매개 변수 소스로 사용하고 프로그래밍 방식으로 매개 변수 값을 지정하는 방법을 살펴보았습니다.
ObjectDataSource와 마찬가지로 SqlDataSource는 기본 데이터를 수정하는 기능도 제공합니다. 다음 자습서에서는 SqlDataSource를 사용하여 , INSERT
, 및 UPDATE
문을 정의하는 DELETE
방법을 살펴보겠습니다. 이러한 문이 추가되면 GridView, DetailsView 및 FormView 컨트롤에 내재된 기본 제공 삽입, 편집 및 삭제 기능을 활용할 수 있습니다.
행복한 프로그래밍!
작성자 정보
7개의 ASP/ASP.NET 책의 저자이자 4GuysFromRolla.com 창립자인 Scott Mitchell은 1998년부터 Microsoft 웹 기술을 연구해 왔습니다. Scott은 독립 컨설턴트, 트레이너 및 작가로 일합니다. 그의 최신 책은 Sams Teach Yourself ASP.NET 2.0 in 24 Hours입니다. 그에게 mitchell@4GuysFromRolla.com으로 연락할 수 있습니다.
특별히 감사드립니다.
이 자습서 시리즈는 많은 유용한 검토자가 검토했습니다. 이 자습서의 수석 검토자는 Scott Clyde, Randell Schmidt 및 Ken Pespisa였습니다. 예정된 MSDN 문서를 검토하는 데 관심이 있으신가요? 그렇다면 mitchell@4GuysFromRolla.com으로 메시지를 보내 주세요.