데이터 소스 컨트롤을 사용하여 Null 데이터베이스 값 처리

Visual Studio 2010

업데이트: 2007년 11월

많은 경우 데이터베이스 테이블의 열에 저장된 값이 없으면 해당 열에서 null을 반환합니다. 그러나 ASP.NET 코드나 데이터 바인딩된 웹 컨트롤을 사용하여 작업할 때는 null 값이 문제가 될 수 있습니다. 예를 들어, DropDownList 컨트롤의 SelectedValuenull에 바인딩하려고 하면 예외가 throw됩니다.

ASP.NET에는 null 값을 처리하기 위한 몇 가지 기본 제공 기능이 있습니다. 기본 제공되는 ASP.NET 기능을 사용해도 문제를 해결할 수 없는 상황이라면 몇 가지 다른 기술을 활용하여 null 값을 처리할 수 있습니다.

BoundField, CheckBoxFieldImageField 개체 같이 데이터 소스 컨트롤에 바인딩된 필드의 NullDisplayText 속성을 설정하여 데이터 소스에서 반환되는 null 값을 문자열 등의 특정 값으로 대체할 수 있습니다. 그런 다음 해당 컨트롤에서 이 값을 바인딩된 컨트롤의 텍스트로 표시할 수 있습니다. 편집 작업을 진행하면서 데이터 바인딩된 행을 수정한 경우 바인딩된 필드의 값이 NullDisplayText와 일치하면(값이 수정되지 않았거나 사용자가 NullDisplayText와 동일한 값을 입력한 경우) 필드에서 null을 데이터 소스에 필드 값으로 전달합니다. NullDisplayText 속성을 설정하지 않은 경우에는 null 값이 빈 문자열("")로 표시됩니다.

예를 들어, BoundField 개체의 NullDisplayText 속성을 "(no value)"로 설정한 경우, 바인딩된 데이터 열이 null이면 BoundField 개체를 통해 렌더링된 Label 또는 TextBox 개체의 Text 속성이 "(no value)"로 설정됩니다. 사용자가 행을 편집하여 값을 "(no value)"에서 "Custom Value"로 변경하면 "Custom Value"라는 값이 데이터 소스에 필드 값으로 전달됩니다. 그러나 바인딩된 컨트롤의 값이 여전히 "(no value)"이면 데이터 컨트롤에서는 데이터 소스에 null을 필드 값으로 전달합니다.

Parameter 개체, TemplateField 개체 및 바인딩된 필드(BoundField, CheckBoxField, ImageFieldAutoGeneratedField 개체)는 업데이트, 삽입 또는 삭제 작업을 진행할 때 개체에서 빈 문자열("") 값을 어떻게 취급할지 결정하는 ConvertEmptyStringToNull 속성을 지원합니다. 개체의 ConvertEmptyStringToNull 속성이 true이고 해당 개체의 값이 빈 문자열인 경우 이 개체는 데이터 소스에 null을 개체 값으로 전달합니다. 개체의 ConvertEmptyStringToNull 속성이 false이고 개체의 값이 빈 문자열인 경우에는 데이터 소스에 빈 문자열이 개체 값으로 전달됩니다.

템플릿에는 바인딩된 필드가 여러 개 포함될 수 있으므로 TemplateField 개체에는 NullDisplayText 속성이 없습니다. 이 경우 바인딩된 필드에 대한 null 처리 프로시저를 직접 만든 다음 Eval 메서드를 사용하여 단방향 데이터 바인딩 구문을 통해 데이터 바인딩된 값을 프로시저에 전달할 수 있습니다. 양방향 데이터 바인딩 시나리오의 경우 EvalBind 메서드를 통해 다음 예제와 같이 AppendDataBoundItems 속성이 true로 설정된 DropDownList 컨트롤을 사용할 수 있습니다.

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Northwind Employees</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="EmployeeID"
            DataSourceID="SqlDataSource1">
            <Columns>
                <asp:CommandField ShowEditButton="True" />
                <asp:BoundField DataField="EmployeeID" HeaderText="EmployeeID" InsertVisible="False"
                    ReadOnly="True" SortExpression="EmployeeID" />
                <asp:BoundField DataField="LastName" HeaderText="LastName" SortExpression="LastName" />
                <asp:BoundField DataField="FirstName" HeaderText="FirstName" SortExpression="FirstName" />
                <asp:TemplateField HeaderText="ReportsTo" SortExpression="ReportsTo">
                    <ItemTemplate>
                        <asp:DropDownList ID="DropDownList1" runat="server" Enabled="False" DataSourceID="SqlDataSource2"
                            DataTextField="Name" DataValueField="EmployeeID" SelectedValue='<%# Eval("ReportsTo") %>' AppendDataBoundItems="True">
                            <asp:ListItem Selected="True" Value="">(none)</asp:ListItem>
                        </asp:DropDownList>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:DropDownList ID="DropDownList2" runat="server" DataSourceID="SqlDataSource2"
                            DataTextField="Name" DataValueField="EmployeeID" SelectedValue='<%# Bind("ReportsTo") %>' AppendDataBoundItems="True">
                            <asp:ListItem Selected="True" Value="">(none)</asp:ListItem>
                        </asp:DropDownList>
                    </EditItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:Northwind %>"
            SelectCommand="SELECT [EmployeeID], [LastName], [FirstName], [ReportsTo] FROM [Employees]"
            UpdateCommand="UPDATE [Employees] SET [LastName] = @LastName, [FirstName] = @FirstName, [ReportsTo] = @ReportsTo WHERE [EmployeeID] = @EmployeeID">
            <UpdateParameters>
                <asp:Parameter Name="LastName" Type="String" />
                <asp:Parameter Name="FirstName" Type="String" />
                <asp:Parameter Name="ReportsTo" Type="Int32" />
                <asp:Parameter Name="EmployeeID" Type="Int32" />
            </UpdateParameters>
        </asp:SqlDataSource>
        <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:Northwind %>"
            SelectCommand="SELECT EmployeeID, LastName + ', ' + FirstName As Name From Employees">
        </asp:SqlDataSource>
    </div>
    </form>
</body>
</html>


AppendDataBoundItems 속성이 true로 설정되어 있으면 정적 항목과 데이터 소스에서 생성된 데이터로 DropDownList 컨트롤이 채워집니다. DropDownList 컨트롤에 추가되는 정적 목록 항목의 Value 속성은 빈 문자열로 설정되어 있기 때문에 null 값을 포함하는 데이터 항목은 정적 목록 항목에 바인딩됩니다.

EvalBind 메서드에 대한 자세한 내용은 데이터 바인딩 식 개요를 참조하십시오.

ObjectDataSource 컨트롤의 소스 역할을 할 개체를 만드는 경우 개체의 코드 내에서 null 값의 변환을 관리할 수 있습니다. 이를 위한 두 가지 방법으로 nullable 형식을 사용하거나 데이터 집합 같은 강력한 형식의 개체에 대한 주석을 사용할 수 있습니다.

ms366709.alert_note(ko-kr,VS.100).gif참고:

ObjectDataSource 컨트롤에 대한 자세한 내용은 ObjectDataSource 웹 서버 컨트롤 개요를 참조하십시오.

Nullable 형식 사용

ObjectDataSource 컨트롤에 대한 소스 개체의 선택, 삽입, 업데이트 및 삭제 메서드를 만드는 경우 데이터 소스에서 매개 변수 값이 null이 될 수 있으면 해당 메서드에 대한 매개 변수와 반환 값을 nullable 형식으로 정의할 수 있습니다. Nullable 형식은 일반 값이나 null 값이 될 수 있는 부울 또는 정수 같은 값 형식입니다.

Visual Basic에서 nullable 형식을 사용하는 데 대한 자세한 내용은 Nullable 값 형식을 참조하십시오. C#에서 nullable 형식을 사용하는 데 대한 자세한 내용은 Nullable 형식 사용(C# 프로그래밍 가이드)을 참조하십시오.

강력한 형식의 데이터 집합 주석

ObjectDataSource 컨트롤에 대한 일반적인 소스 개체는 강력한 형식의 DataSet 개체입니다. nullValue 주석을 사용하여 강력한 형식의 DataSet에 주석을 달면 강력한 형식의 DataSet을 통해 데이터 소스에서 반환된 null 값을 지정된 값으로 변환할 수 있습니다. 자세한 내용은 형식화된 DataSets 주석 지정(ADO.NET)를 참조하십시오.

표시: