Freigeben über


Behandlung von NULL-Datenbankwerten mithilfe von Datenquellensteuerelementen

Aktualisiert: November 2007

In vielen Fällen geben Spalten in Datenbanktabellen null zurück, wenn in dieser Spalte kein Wert gespeichert ist. Bei der Arbeit mit ASP.NET-Code oder datengebundenen Websteuerelementen kann ein null-Wert allerdings ein Problem darstellen. Wenn Sie beispielsweise SelectedValue aus einem DropDownList-Steuerelement an null binden, wird eine Ausnahme ausgelöst.

ASP.NET stellt einige integrierte Funktionen für null-Werte bereit. Wenn sich ein Problem durch die integrierten ASP.NET-Funktionen nicht lösen lässt, stehen noch andere Verfahren für die Behandlung von null-Werten zur Verfügung.

NullDisplayText-Eigenschaft

Sie können die NullDisplayText -Eigenschaft von gebundenen Feldern in Datenquellen-Steuerelementen (wie z. B. die Objekte BoundField, CheckBoxField und ImageField) so festlegen, dass von der Datenquelle zurückgegebene null-Werte durch einen bestimmten Wert (z. B. eine Zeichenfolge) ersetzt werden. Dieser Wert wird dann von den Steuerelementen als Text des gebundenen Steuerelements angezeigt. Wenn eine datengebundene Zeile bei einem Bearbeitungsvorgang geändert wird und der Wert eines gebundenen Felds NullDisplayText entspricht (weil der Wert nicht geändert wurde oder der Benutzer den gleichen Wert wie NullDisplayText eingegeben hat), übergibt das Feld null als Feldwert an die Datenquelle. Wenn die NullDisplayText-Eigenschaft nicht festgelegt ist, werden null-Werte als leere Zeichenfolgen ("") angezeigt.

Wenn Sie beispielsweise die NullDisplayText-Eigenschaft für ein BoundField-Objekt auf "(kein Wert)" festlegen und die Spalte mit den gebundenen Daten den Wert null hat, wird die Text-Eigenschaft für Label-Objekte oder TextBox-Objekte, die vom BoundField-Objekt dargestellt wird, auf "(kein Wert)" festgelegt. Wenn der Benutzer die Zeile bearbeitet und den Wert von "(kein Wert)" in "Benutzerdefinierter Wert" ändert, wird der Wert "Benutzerdefinierter Wert" als Wert dieses Felds an die Datenquelle übergeben. Wenn der Wert des gebundenen Steuerelements jedoch noch immer "(kein Wert)" ist, wird null vom Datensteuerelement als Feldwert an die Datenquelle übergeben.

ConvertEmptyStringToNull-Eigenschaft

In Parameter-Objekten, TemplateField-Objekten und gebundenen Feldern (den Objekten BoundField, CheckBoxField, ImageField und AutoGeneratedField) wird eine ConvertEmptyStringToNull -Eigenschaft unterstützt, die festlegt, wie die Werte leerer Zeichenfolgen ("") beim Aktualisieren, Einfügen oder Löschen behandelt werden sollen. Wenn die ConvertEmptyStringToNull-Eigenschaft für ein Objekt true ist und der Wert für dieses Objekt eine leere Zeichenfolge ist, wird null als Objektwert an die Datenquelle übergeben. Wenn die ConvertEmptyStringToNull-Eigenschaft für ein Objekt false ist und der Wert für dieses Objekt eine leere Zeichenfolge ist, wird als Objektwert eine leere Zeichenfolge an die Datenquelle übergeben.

Konvertieren von NULL in Vorlagenfeldern

Das TemplateField-Objekt hat keine NullDisplayText-Eigenschaft, da die Vorlage mehrere gebundene Felder enthalten kann. Sie können jedoch ein eigenes Verfahren für die Behandlung von null erstellen und dann die datengebundenen Werte mithilfe von unidirektionaler Datenbindungssyntax an dieses Verfahren übergeben, indem die Eval-Methode verwendet wird. Für bidirektionale Datenbindungsszenarios unter Verwendung der Eval-Methode und der Bind-Methode können Sie ein DropDownList-Steuerelement verwenden, für das die AppendDataBoundItems-Eigenschaft auf true festgelegt ist, wie im folgenden Beispiel dargestellt.

<%@ 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 >
    <title>Northwind Employees</title>
</head>
<body>
    <form id="form1" >
    <div>
        <asp:GridView ID="GridView1"  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"  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"  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"  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"  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 >
    <title>Northwind Employees</title>
</head>
<body>
    <form id="form1" >
    <div>
        <asp:GridView ID="GridView1"  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"  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"  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"  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"  ConnectionString="<%$ ConnectionStrings:Northwind %>"
            SelectCommand="SELECT EmployeeID, LastName + ', ' + FirstName As Name From Employees">
        </asp:SqlDataSource>
    </div>
    </form>
</body>
</html>

Wenn die AppendDataBoundItems-Eigenschaft auf true festgelegt wird, werden sowohl statische Element als auch aus der Datenquelle generierte Daten in das DropDownList-Steuerelement geladen. Für das statische Listenelement, das dem DropDownList-Steuerelement hinzugefügt wird, ist die Value-Eigenschaft auf eine leere Zeichenfolge festgelegt. Damit wird ein Datenelement, das einen NULL-Wert enthält, an das statische Listenelement gebunden.

Weitere Informationen über die Eval-Methode und die Bind-Methode finden Sie unter Übersicht über Datenbindungsausdrücke.

Techniken für die Arbeit mit NULL unter Verwendung des ObjectDataSource-Steuerelements

Wenn Sie ein Objekt erstellen, das als Quelle für ein ObjectDataSource-Steuerelement dienen soll, können Sie die Konvertierung von null-Werten innerhalb des Objektcodes verwalten. Es stehen zwei Optionen zur Verfügung: Typen, die NULL-Werte zulassen, und Anmerkungen für stark typisierte Objekte, z. B. DataSets.

Hinweis:

Weitere Informationen über das ObjectDataSource-Steuerelement finden Sie unter Übersicht über das ObjectDataSource-Webserversteuerelement.

Verwenden von Typen, die NULL-Werte zulassen

Beim Erstellen der Methoden für Auswahl, Einfügen, Aktualisieren und Löschen für ein Quellobjekt eines ObjectDataSource-Steuerelements können Sie Parameter und Rückgabewerte für diese Methoden als Typen, die NULL-Werte zulassen, definieren, wenn der Parameterwert null in der Datenquelle sein kann. Typen, die NULL-Werte zulassen, sind Werttypen wie ganze Zahlen oder boolesche Werte, die entweder einen regulären Wert oder einen null-Wert annehmen können.

Weitere Informationen zu Typen in Visual Basic, für die NULL-Werte zulässig sind, finden Sie unter Auf NULL festlegbare Werttypen. Weitere Informationen zu Typen in C#, für die NULL-Werte zulässig sind, finden Sie unter Verwenden von auf NULL festlegbaren Typen (C# Programmierhandbuch).

Stark typisierte DataSets mit Anmerkungen versehen

Ein häufiges Quellobjekt für das ObjectDataSource-Steuerelement ist ein stark typisiertes DataSet-Objekt. Um zu erreichen, dass ein stark typisiertes DataSet-Objekt die von einer Datenquelle zurückgegebenen null-Werte in von Ihnen festgelegte Werte konvertiert, können Sie das stark typisierte DataSet-Objekt mithilfe der nullValue-Anmerkung mit einer Anmerkung versehen. Weitere Informationen hierzu finden Sie unter Hinzufügen von Anmerkungen zu typisierten DataSets (ADO.NET).

Siehe auch

Konzepte

Übersicht über Datenquellensteuerelemente

Übersicht über datengebundene ASP.NET-Webserversteuerelemente

Übersicht über Datenbindungsausdrücke