次の方法で共有


データ ソース コントロールを使用した、データベースの Null 値の処理

更新 : 2007 年 11 月

多くの場合、データベース テーブルの列に値が格納されていないとき、その列は null を返します。ただし、ASP.NET コードやデータ バインド Web コントロールを処理する場合は、null 値が問題になることがあります。たとえば、DropDownList コントロールの SelectedValue を null にバインドしようとすると、例外がスローされます。

ASP.NET には null 値を処理するための組み込み機能が用意されています。組み込みの ASP.NET 機能では解決できない場合、null 値を処理するために使用できる技術がその他にもあります。

NullDisplayText プロパティ

データ ソース コントロール (BoundFieldCheckBoxFieldImageField などのオブジェクト) ではバインド フィールドの 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 をフィールド値としてデータ ソースに渡します。

ConvertEmptyStringToNull プロパティ

Parameter オブジェクト、TemplateField オブジェクト、およびバインド フィールド (BoundFieldCheckBoxFieldImageFieldAutoGeneratedField の各オブジェクト) は、ConvertEmptyStringToNull プロパティをサポートします。このプロパティは、更新、挿入、または削除の操作時に、オブジェクトが空の文字列 ("") を処理する方法を決定します。オブジェクトの ConvertEmptyStringToNull プロパティが true で、そのオブジェクトの値が空の文字列の場合、オブジェクトはオブジェクト値として null をデータ ソースに渡します。オブジェクトの ConvertEmptyStringToNull プロパティが false で、そのオブジェクトの値が空の文字列の場合、オブジェクト値として空の文字列がデータ ソースに渡されます。

テンプレート フィールドの Null の変換

テンプレートには複数のバインド フィールドが含まれる可能性があるため、TemplateField オブジェクトに NullDisplayText プロパティはありません。ただし、null を処理する独自のプロシージャをバインド フィールドに作成し、Eval メソッドを使用する一方向のデータ バインディング構文で、そのプロシージャにデータ バインド値を渡すことはできます。Eval メソッドと Bind メソッドを使用する双方向のデータ バインディングの場合は、次に示す例のように、AppendDataBoundItems プロパティを true に設定した DropDownList コントロールを使用できます。

<%@ Page Language="VB" %>

<!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>
<%@ 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 値を含むデータ項目がバインドされます。

Eval メソッドおよび Bind メソッドの詳細については、「データ バインド式の概要」を参照してください。

ObjectDataSource コントロールを使用して Null を処理する技術

ObjectDataSource コントロールのソースとして動作するオブジェクトを作成するとき、オブジェクトのコード内で null 値の変換を管理できます。null 許容型と、データセットなど厳密に型指定されたオブジェクトの注釈という 2 つのオプションを使用できます。

ms366709.alert_note(ja-jp,VS.90).gifメモ :

ObjectDataSource コントロールの詳細については、「ObjectDataSource Web サーバー コントロールの概要」を参照してください。

Null 許容型の使用

ObjectDataSource コントロールで、ソース オブジェクトの選択、挿入、更新、および削除の各メソッドを作成するとき、データ ソースのパラメータ値に null を指定できる場合、パラメータを定義して、null 許容型としてそのメソッドの値を返すことができます。Null 許容型は、正規値または null 値を指定できる整数またはブール値などの値型です。

Visual Basic の null 許容型の使用方法については、「null 許容値型」を参照してください。C# の null 許容型の使用方法については、「Null 許容型の使用 (C# プログラミング ガイド)」を参照してください。

厳密に型指定したデータセットの注釈

ObjectDataSource コントロールの共通のソース オブジェクトは、厳密に型指定された DataSet オブジェクトです。厳密に型指定した DataSet で、データ ソースから返された null 値を指定した値に変換するには、nullValue 注釈を使用して厳密に型指定した DataSet に注釈を付けます。詳細については、「型指定された DataSet の注釈 (ADO.NET)」を参照してください。

参照

概念

データ ソース コントロールの概要

ASP.NET のデータ バインド Web サーバー コントロールの概要

データ バインド式の概要