Partager via


Gestion de valeurs de base de données Null à l'aide de contrôles de source de données

Mise à jour : novembre 2007

Dans de nombreux cas, les colonnes des tables de base de données retournent null lorsqu'aucune valeur n'est stockée dans cette colonne. Toutefois, une valeur null peut présenter certaines difficultés lors de l'utilisation du code ASP.NET ou des contrôles Web liés aux données. Par exemple, une exception est levée si vous essayez de lier la SelectedValue d'un contrôle DropDownList à null.

ASP.NET fournit des fonctionnalités intégrées à utiliser avec les valeurs null. Si votre scénario n'est pas résolu en utilisant les fonctions ASP.NET intégrées, il existe quelques techniques supplémentaires que vous pouvez utiliser lors de l'utilisation des valeurs null.

Propriété NullDisplayText

Vous pouvez définir la propriété NullDisplayText des champs liés dans les contrôles de source de données (par exemple, les objets BoundField, CheckBoxField et ImageField) pour substituer une valeur spécifique (telle qu'une chaîne) aux valeurs null retournées de la source de données. Les contrôles afficheront ensuite cette valeur comme texte du contrôle dépendant. Lorsqu'une ligne liée aux données est changée pendant une modification, si la valeur pour un champ lié correspond au NullDisplayText (si la valeur n'a pas été modifiée ou que l'utilisateur a entré la même valeur que le NullDisplayText), le champ passe null à la source de données comme valeur de champ. Si la propriété NullDisplayText n'est pas définie, les valeurs null sont affichées comme chaînes vides ("").

Par exemple, si vous affectez la valeur "(aucune valeur)" à la propriété NullDisplayText d'un objet BoundField et que la colonne des données liées est null, la propriété Text des objets Label ou TextBox restitués par l'objet BoundField a la valeur "(aucune valeur)". Si l'utilisateur modifie la ligne et remplace la valeur "(aucune valeur)" par "Valeur personnalisée", la valeur "Valeur personnalisée" est passée à la source de données comme valeur pour le champ. En revanche, si la valeur du contrôle dépendant est toujours "(aucune valeur)", le contrôle de données passe null à la source de données comme valeur de champ.

Propriété ConvertEmptyStringToNull

Les objets Parameter, objets TemplateField et champs liés (objets BoundField, CheckBoxField, ImageField et AutoGeneratedField) prennent en charge une propriété ConvertEmptyStringToNull qui détermine la façon dont l'objet traitera les valeurs de chaînes vides ("") pendant des opérations d'insertion, de mise à jour ou de suppression. Si la propriété ConvertEmptyStringToNull a la valeur true pour un objet et que la valeur de cet objet est une chaîne vide, l'objet passe null à la source de données comme valeur d'objet. Si la propriété ConvertEmptyStringToNull a la valeur false pour un objet et que la valeur de cet objet est une chaîne vide, une chaîne vide est passée à la source de données comme valeur d'objet.

Conversion de valeurs Null dans les champs de modèle

L'objet TemplateField n'a pas de propriété NullDisplayText, car le modèle peut contenir plusieurs champs liés. Toutefois, vous pouvez créer votre propre procédure de gestion null pour un champ lié, puis passer la valeur liée aux données à la procédure avec la syntaxe de liaison de données unidirectionnelle, à l'aide de la méthode Eval. Pour les scénarios de liaison de données bidirectionnels, à l'aide des méthodes Eval et Bind, vous pouvez utiliser un contrôle DropDownList avec la propriété AppendDataBoundItems définie à la valeur true, comme le montre l'exemple suivant.

<%@ 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>

Lorsque la propriété AppendDataBoundItems a la valeur true, le contrôle DropDownList est rempli à la fois avec des éléments statiques et des données générées à partir de la source de données. L'élément de liste statique qui est ajouté au contrôle DropDownList a la propriété Value définie à une chaîne vide. Avec cela, un élément de données qui contient une valeur Null est lié à l'élément de liste statique.

Pour plus d'informations sur les méthodes Eval et Bind, consultez Vue d'ensemble des expressions de liaison de données.

Techniques d'utilisation des valeurs Null à l'aide du contrôle ObjectDataSource

Lorsque vous créez un objet pour agir comme source pour un contrôle ObjectDataSource, vous pouvez gérer la conversion de valeurs null dans le code de l'objet. Deux options sont disponibles : les types nullables et les annotations pour les objets fortement typés, tels que les groupes de données.

Remarque :

Pour plus d'informations sur le contrôle ObjectDataSource, consultez Vue d'ensemble du contrôle serveur Web ObjectDataSource.

Utilisation des types nullables

Lorsque vous créez les méthodes Select, Insert, Update et Delete de l'objet source pour un contrôle ObjectDataSource, si la valeur de paramètre peut être null dans la source de données, vous pouvez définir des paramètres et des valeurs de retour pour ces méthodes comme types nullables. Les types nullables sont des types valeur, tels qu'un entier ou un Boolean, qui peuvent représenter une valeur standard ou une valeur null.

Pour plus d'informations sur l'utilisation des types nullables avec Visual Basic, consultez Types valeur nullables. Pour plus d'informations sur l'utilisation des types nullables avec C#, consultez Utilisation de types nullables (Guide de programmation C#).

Annotation d'un groupe de données fortement typé

Un objet source courant pour le contrôle ObjectDataSource est un objet DataSet fortement typé. Pour qu'un DataSet fortement typé convertisse des valeurs null retournées d'une source de données en une valeur que vous spécifiez, vous pouvez annoter le DataSet fortement typé à l'aide de l'annotation nullValue. Pour plus d'informations, consultez Annotation de DataSets typés (ADO.NET).

Voir aussi

Concepts

Vue d'ensemble des contrôles de source de données

Vue d'ensemble des contrôles serveur Web liés aux données ASP.NET

Vue d'ensemble des expressions de liaison de données