Compartilhar via


Manipulando Valores Nulos de Banco de Dados Usando Controles de Fontes de Dados

Em muitos casos, colunas nas tabelas de banco de dados retornam null quando nenhum valor é armazenado nesta coluna.No entanto, um null valor pode apresentar desafios ao trabalhar com código ASP.NET ou controles da Web com dados vinculados. Por exemplo, uma exceção é lançada se você tentar vincular o SelectedValue de um controle DropDownList a null.

O ASP.NET fornece alguma funcionalidade interna para trabalhar com valores null.Se a sua situação não é resolvida para usar os recursos internos do ASP.NET, existem algumas técnicas adicionais que você pode usar para trabalhar com valores null.

A Propriedade NullDisplayText

Você pode definir a propriedade NullDisplayText de campos associados em controles de fonte de dados (como os objetos BoundField, CheckBoxField e ImageField) para substituir um valor específico (como uma cadeia de caracteres) para valores null retornados de uma fonte de dados.Controles então mostrarão este valor como o texto do controle associado.Quando uma linha de dados associados é modificada durante uma operação de edição, se o valor para um campo associado é igual a NullDisplayText (se o valor não foi modificado ou o usuário inseriu o mesmo valor como NullDisplayText), o campo passa null para a fonte de dados como o valor do campo.Se a propriedade NullDisplayText não está definida, valores null são exibidos como cadeias de caracteres vazias ("").

Por exemplo, se você definir a propriedade NullDisplayText de um objeto BoundField para "(nenhum valor)" e se a coluna de dados associados é null, a propriedade Text para Label ou objetos TextBox representados pelo objeto BoundField é definido para "(nenhum valor)".Se o usuário edita uma linha e altera o valor de "(nenhum valor)" para "Valor Personalizado", o valor "Valor Personalizado" é passado para a fonte de dados como o valor para o campo.Mas, se o valor do controle associado ainda for "(nenhum valor)", o controle de dados passa null para a fonte de dados como o valor do campo.

A Propriedade ConvertEmptyStringToNull

Objetos Parameter, obejtos TemplateField e campos associados (objetos BoundField, CheckBoxField, ImageField e AutoGeneratedField) suportam uma propriedade ConvertEmptyStringToNull que determina como o objeto vai tratar os valores de cadeia de caracteres vazia ("") durantes operações de atualização, inserção ou exclusão.Se a propriedade ConvertEmptyStringToNull é true para um objeto e se o valor para este objeto é uma cadeia de caracteres vazia, o objeto passa null para a fonte de dados como o valor do objeto.Se a propriedade ConvertEmptyStringToNull é false para um objeto e o valor do objeto é uma cadeia de caracteres vazia, uma cadeia de caracteres vazia é passada para a fonte de dados como o valor do objeto.

Convertendo Nulo em Campos do Modelo

O objeto TemplateField não tem uma propriedade NullDisplayText, porque o modelo pode conter vários campos associados.No entanto, você pode criar seus próprios null manipulação de procedimento para um campo limite e passar a ligação de dados de valor para o procedimento com sintaxe de vinculação de dados unidirecional, usando o Eval método. Para cenários de ligação de dados bidirecionais, usando o Eval e Bind métodos, você pode usar um DropDownList controle com o AppendDataBoundItems conjunto de propriedades sistema autônomo true, conforme mostrado no exemplo a seguir.

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

Quando o AppendDataBoundItems propriedade estiver definida como true, o DropDownList controle é preenchida com itens estático e dados gerados a partir da fonte de dados. O estático lista item adicionado à DropDownList controle tem o Value conjunto de propriedades como uma seqüência de caracteres vazia. Com isso, um item de dados que contém um valor nulo é limite ao item da lista estática.

Para obter mais informação sobre os métodos Eval e Bind, veja Visão geral de expressões de ligação de dados.

Técnicas para Trabalhar com Nulo Usando o Controle ObjectDataSource

Quando você cria um objeto para atuar como a origem para um controle ObjectDataSource, você pode gerenciar a conversão de valores null dentro do código do objeto.Há duas opções disponível: tipos anuláveis e anotações para objetos com rigidez de tipos, sistema autônomo conjuntos de dados.

Observação:

Para obter mais informação sobre o controle ObjectDataSource, veja Visão geral sobre o controle de servidor Web ObjectDataSource.

Usando Tipos Que Podem Ser Nulos

Quando você cria os métodos de seleção, inseção, atualização e exclusão do objeto de origem para um controle ObjectDataSource, se o valor do parâmetro pode ser null na fonte de dados, você pode definir parâmetros e retornar valores para esse métodos como tipos que podem ser nulos.Tipos que permitem valores nulos são tipos de valores como um inteiro ou um valor booleano que podem ser um valor comum ou um valor null.

Para obter informação sobre o uso de tipos que permitem valores nulos com Visual Basic, veja Tipos de Valor Anuláveis..Para obter informação sobre o uso de tipos que permitem valores nulos com C#, veja Usando anulável Types (C# Guia de programação).

Anotando um Dataset Rigidamente Classificado

Um objeto de origem comum para o controle ObjectDataSource é um objeto rigidamente classificado DataSet.Para ter um DataSet rigidamente classificado que converta valores null retornados de uma fonte de dados para um valor que você especificar, você poderá anotar o DataSet classificado rigidamente utilizando a anotação nullValue.Para obter mais informações, consulte Using Annotations com a DataSet Typed.

Consulte também

Conceitos

Visão geral sobre controles fonte de dados

Visão geral de controle servidor Web com dados vinculados

Visão geral de expressões de ligação de dados