'SqlDataSource'에 해당되는 글 2건

Programming/.NET
데이터 소스 컨트롤(Data Source Control) 중의 하나인 SqlDataSource 컨트롤은 SQL Server, Oracle, ODBC, OLE DB 등 데이터베이스기반의 데이터를 다루는 컨트롤입니다.

일단 SqlDataSource 컨트롤을 사용하려면 Visual Studio 의 소스나 디자인모드에서 SqlDataSource 컨트롤을 끌어다 놓은뒤 생성된 SqlDataSource 컨트롤을 디자인모드에서 클릭합니다.

그러면 해당 컨트롤에 대한 스마트태그가 표시되는데 여기에서 'Configure Data Source' 항목을 선택하고 Configure Data Source 대화상자를 열어 어느 데이터베이스로 연결할지를 지정하면 됩니다.

▶ 그림 1-1

그림 1-1 에서는 현재 어떠한 연결정보도 설정되어 있지 않으므로 어떠한 연결항목도 표시하지 않습니다. 따라서 'New Connection' 버튼을 눌러 새로운 연결정보를 생성하도록 해야 합니다.

▶ 그림 1-2

그림 1-2 에서는 연결하고자 하는 데이터의 유형을 선택합니다. 예제에서는 SQL Server 와의 연결을 구성할 것이므로 'Microsoft SQL Server'를 선택하고 'Data provider' 항목으로 '.NET Framework Data Provider for SQL Server'를 선택하였습니다.

▶ 그림 1-3

그림 1-2 에서 연결할 유형을 선택하고 나면 그림 1-3과 같이 해당 유형에 맞는 서버연결설정을 진행해야 합니다.

Server name 에 연결할 서버의 주소를 입력하고 Log on to the server 에 연결계정을, Connect to a database 에서 해당서버에 연결할 DataBase항목을 선택합니다. 모든 설정이 정상적으로 완료되었다면 그림 1-1과 달리 연결할 항목이 추가된 그림 1-4와 같은 화면을 볼 수 있게 됩니다.

▶ 그림 1-4

그림 1-4 에서 연결할 항목을 선택하고 'Next' 버튼을 누릅니다.

▶ 그림 1-5

그림 1-5는 해당 연결정보를 저장할 것인지 선택하는 부분입니다. 만약 'Yes, save this connection as' 체크박스를 체크하여 설정정보를 저장하도록 했다면 하단에 보이는 문자열 값을 이름으로하여 Web.config 파일에 연결정보를 저장하게 되며 그렇지 않은 경우라면 SqlDataSource 컨트롤의 ConnectionString 속성에 그대로 모든 설정값을 넣어 관리하게 됩니다.

▶ 그림 1-6

그림 1-6에서는 그림 1-3 에서 선택한 DataBase에 있는 테이블(Table)과 뷰(View) 항목을 나열하게 됩니다. 여기에서 SqlDataSource 컨트롤로 불러올 테이블이나 뷰항목을 선택하도록 합니다.

만약 불러올 데이터에 대한 특정 조건이나 반환순서등 데이터가공이 필요한 경우라면 그림 1-6 오른쪽에 있는 WHERE 나 ORDER BY 버튼을 클릭하여 불러올 데이터의 조건을 지정할 수 있습니다.

또 다른 버튼으로 Advanced 를 누르면 대상 데이터에 대한 INSERT, UPDATE, DELETE 문을 설정할 수 있을 뿐만 아니라 optimistic concurrency 를 설정하여 UPDATE나 DELETE 문을 처리할때 SqlDataSource 컨트롤로 가져온 데이터의 내용이 기존의 데이터와 다른 경우 변경처리를 취소할 수 있도록 지정하는 것도 가능합니다.

마지막으로 'Return only unique rows' 체크박스를 클릭하면 중복된 데이터는 가져오지 않게 됩니다.

이와 같이 여러 설정을 거치게 되면 해당 데이터를 가져오는 SQL 구문이 바뀌게 되며 'SELECT statment' 하단에 그 내용을 확인할 수 있습니다.

▶ 그림 1-7

그림 1-7은 앞서 설정한 최종적 SQL 구문이 원하는대로 동작하는지를 테스트해 볼 수 있는 화면입니다. Test Query 를 눌러 이상이 없는 것으로 판단되면 'Finish'버튼을 눌러 설정을 마무리합니다.

설정을 마무리 짓고 SqlDataSource 컨트롤이 위치한 페이지의 소스를 보면 지금까지 설정한 내용이 추가적으로 등록되어 있음을 알 수 있으며 해당 아마도 코드 1-1과 비슷할 것입니다. 참고로 코드 1-1은 그림 1-5에서 설정정보를 저장하지 않도록 한 결과입니다.
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="Data Source=192.168.0.1;Initial Catalog=test;User ID=sa;Password=1234" ProviderName="System.Data.SqlClient" SelectCommand="SELECT * FROM [product_sales]"></asp:SqlDataSource>
▶ 코드 1-1

만일 SqlDataSource 안에서 쿼리 처리시 발생되는 오류상황을 제어하려면 쿼리 실행방식에 해당하는 이벤트 안에서 Exception 값이 Null인지 여부를 판단하면 됩니다.
protected void SqlDataSource1_Updated(object sender, SqlDataSourceStatusEventArgs e)
{
    if (e.Exception != null)
    {
        //오류
    }
    else {
        //정상
    }
}
만약 오류가 발생함에도 불구하고 내부 처리가 계속되어야 한다면 ExceptionHandled 속성을 true로 지정합니다.
protected void SqlDataSource1_Updated(object sender, SqlDataSourceStatusEventArgs e)
{
    if (e.Exception != null)
    {
        //오류

        e.ExceptionHandled = true;
    }
    else {
        //정상
    }
}
0 0
Programming/.NET
 1. SelectParameters

다음과 같이 SqlDataSource 컨트롤에 SelectCommand 속성에서처럼 쿼리가 설정된 경우
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString='<%$ ConnectionStrings:testConnectionString %>' SelectCommand="SELECT * FROM [product_sales]"></asp:SqlDataSource>
해당 쿼리구문안에 특정값으로 들어가는 조건절등이 추가되어야 한다면 SelectParameters 컬렉션을 사용할 수 있습니다. SelectParameters 는 Parameters 클래스로부터 파생되었으며 여러가지 매개변수를 통해 조건절에 들어갈 값을 설정할 수 있습니다.

예를 들어 url 의 get 값을 통해 Where 조건의 값이 설정되는 경우라면 QueryStringParameter 매개변수를 사용해 코드 1-1과 같이 조건값을 지정합니다.
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString='<%$ ConnectionStrings:testConnectionString %>' SelectCommand="SELECT * FROM [product_sales] Where product = @product">
    <SelectParameters>
        <asp:QueryStringParameter Name="product" QueryStringField="pd" Type="String" DefaultValue="" />
    </SelectParameters>
</asp:SqlDataSource>
▶코드 1-1

SelectCommand 의 쿼리에 Where 구문을 추가하고 product = @product 를 통해 조건값을 지정하였습니다. 이때 @product 는 SelectParameters 의 QueryStringParameter 매개변수 Name과 동일하다는 것을 알 수 있습니다. 또한 QueryStringParameter 는 페이지를 불러오는 url 을 파악하여 QueryStringField 즉, pd 부분의 get값을 @product 에 전달하도록 합니다.

위의 설정이 제대로 처리되는지 확인하기 위해 ListBox 컨트롤을 추가하고 데이터 소스로 SqlDataSource 을 지정합니다.
<asp:ListBox ID="ListBox1" runat="server" DataSourceID="SqlDataSource1" DataTextField="product" DataValueField="sales"></asp:ListBox>
그리고 페이지를 불러올때 QueryStringParameter 에 지정한 대로 url 에 pd 파라메터를 추가하면


SqlDataSource 컨트롤 SelectCommand 쿼리에 조건절 값으로 처리될 것입니다.

참고로 QueryStringParameter 에 지정된 Type 은 해당 값을 처리할 데이터 타입을 의미하며 DefaultValue 는 QueryStringField 에 설정된 파라메터값이 존재하지 않는 경우 기본적으로 처리할 값을 의미합니다. 위 예제에서 http://localhost:61365/default.aspx 로만 url 이 전달되면 @product 에는 공백이 처리될 것입니다.

만약 Parameter 쪽으로 바인딩되는 값 자체가 공백일때 이 것을 null 로서 취급하려면 QueryStringParameter 에 ConvertEmptyStringToNull 속성을 true로 지정해야 합니다.

Parameter 매개변수에는 QueryStringParameter 뿐만 아니라 표 1-1과 같이 다른 형태로서 파라메터를 추가할 수 있으며 필요에 따라 여러 Parameter 매개변수를 혼합하여 사용할 수 있습니다.

 ControlParameter  특정 컨트롤을 통한 파라메터지정
 CookieParameter  쿠키값을 통한 파라메터지정
 FormParameter  Form 컬렉션값을 통한 파라메터지정
 QueryStringParameter  url get 값을 통한 파라메터지정
 ProfileParameter  사용자 프로파일 값을 통한 파라메터지정
 SessionParamter  세션값을 통한 파라메터지정

2. DataSourceMode

SqlDataSource 컨트롤에 설정하는 속성중에 하나로 DataSet 과 DataReader 개체중 어느 쪽을 사용해 데이터를 가져올지 지정합니다.
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString='<%$ ConnectionStrings:testConnectionString %>' SelectCommand="SELECT * FROM [product_sales]" DataSourceMode="DataSet"></asp:SqlDataSource>
이 속성을 'DataSet' 으로 설정하면 데이터 집합은 불러온 데이터를 필터링하거나 정렬할 수 있는 유용함을 제공합니다. 일반 데이터베이스의 속성, 유형, 데이터까지 거의 대부분의 특성을 그대로 가져오게 되는데 실제 데이터 이외부분까지 긁거오므로 데이터베이스와 완벽에 가까운 복사본을 생성합니다.

하지만 DataSet은 단순히 데이터를 불러와 저장하고 끝나는게 아니므로 메모리 사용량이 DataReader 에 비해 높을뿐만 아니라 내부적으로 별도의 처리과정을 거치게 되므로 성능도 떨어집니다. 따라서 활용성보다는 '성능'에 기준을 맞춰야 한다면 이 설정을 DataReader로 할것을 권장합니다.

3. ConflictDetection

데이터 소스로부터 불러온 데이터를 다시 원본에 반영해야 하는 경우 어떤 형식으로 반영할지에 대한 속성이 ConflictDetection 속성입니다. 이 속성을 OverwriteChanges 로 설정하면 데이터를 불러온 시점부터 반영때까지 변경된 모든 사항을 데이터 원본에 덮어쓰게 됩니다.

하지만 이 속성을 CompareAllValues 로 하게되면 가져온 데이터(변경한 데이터가 아닌 가져올때의 원본)와 현재 데이터 소스의 원본을 비교하고 만일 변경된 사항이 발견되면 데이터를 갱신하지 않으며 변경사항이 없어야만 데이터를 갱신하게 되는 방식을 취하게 됩니다.

CompareAllValues 이 방식은 여러사람이 동시에 하나의 데이터원본에 접근했을때 2명이상이 하나의 데이터에 대한 변경시도를 하게 되는 경우 어떤 한 사람이 변경한 내용을 또 다른 사람이 다시 변경하게 되는 상황을 막고자 할때 활용될 수 있습니다.

이 속성은 SqlDataSource 컨트롤에 데이터 소스를 지정하는 경우 'Configure the Select Statement' 단계에서


'Advanced' 버튼을 클릭해 'Use optimistic concurrency' 부분을 체크하면 자동적으로 설정되는 속성이기도 합니다.


다만 대상이 될 테이블에 키가 제대로 설정되어 있지 않으면 기본적으로 Update나 Delete에 대한 'Generate INSERT, UPDATE, and DELETE statements'를 설정할 수 없으며 이 상황에서 'Use optimistic concurrency' 옵션을 체크하면 INSERT 구문만 생성됩니다.

'Use optimistic concurrency' 옵션을 선택하면 SqlDataSource 컨트롤에 Delete 와 Update 내용에 대한 추가와 함께 Parameter 컬렉션에 original_ 형태의 Parameter 도 추가됩니다.
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:testConnectionString %>" SelectCommand="SELECT * FROM [product_sales]" ConflictDetection="CompareAllValues" DeleteCommand="DELETE FROM [product_sales] WHERE [sales] = @original_sales AND (([product] = @original_product) OR ([product] IS NULL AND @original_product IS NULL))" InsertCommand="INSERT INTO [product_sales] ([sales], [product]) VALUES (@sales, @product)" OldValuesParameterFormatString="original_{0}" UpdateCommand="UPDATE [product_sales] SET [product] = @product WHERE [sales] = @original_sales AND (([product] = @original_product) OR ([product] IS NULL AND @original_product IS NULL))">
    <DeleteParameters>
        <asp:Parameter Name="original_sales" Type="Int32" />
        <asp:Parameter Name="original_product" Type="String" />
    </DeleteParameters>
    <InsertParameters>
        <asp:Parameter Name="sales" Type="Int32" />
        <asp:Parameter Name="product" Type="String" />
    </InsertParameters>
    <UpdateParameters>
        <asp:Parameter Name="product" Type="String" />
        <asp:Parameter Name="original_sales" Type="Int32" />
        <asp:Parameter Name="original_product" Type="String" />
    </UpdateParameters>
</asp:SqlDataSource>
▶코드 1-2

여기서 새롭게 추가딘 original_ 형태의 Parameter는 원본과 가져온 대상을 비교하기 위한 Paramter 입니다. SqlDataSource 컨트롤의 속성중 OldValuesParameterFormatString="original_{0}" 이라고 되어 있는 부분이 있는데 original_ 형태의 Parameter가 원본성격을 가진 Paramter 임을 의미합니다. 참고로 original_ 형식은 OldValuesParameterFormatString 속성과 실제 original_ paramter를 수정하여 임의로 바꿀 수 있습니다.

UpdateCommand 와 DeleteCommand 등을 보면 original_paramter 를 활용하여 이전 데이터값에 대한 비교를 통해 'Use optimistic concurrency' 기능이 구현될 수 있도록 하고 있습니다.

SqlDataSource 컨트롤 에서는 OnUpdated 나 OnDeleted 이벤트에서 AffectedRows 속성을 확인하면 동시성 오류가 발생했는지의 여부를 판단할 수 있습니다.
protected void SqlDataSource1_Updated(object sender, SqlDataSourceStatusEventArgs e)
{
    if (e.AffectedRows > 0)
    {
        //성공
    }
    else {
        //오류
    }
}

'Programming > .NET' 카테고리의 다른 글

[ASP.NET] SqlDataSource - 1. 연결설정  (0) 2014.05.02
[ASP.NET] 대기중 표시  (0) 2014.04.23
[ASP.NET] SqlDataSource - 2. 활용  (0) 2014.04.15
[ASP.NET] AccessDataSource  (0) 2014.04.07
[ASP.NET] Literal  (0) 2014.03.07
[ASP.NET] RegularExpressionValidator  (0) 2014.03.06
0 0
1
블로그 이미지

클리엘