Compartir a través de


Controlar valores Null de base de datos mediante controles de origen de datos

Actualización: noviembre 2007

En muchos casos, las columnas de las tablas de bases de datos devuelven null cuando no hay ningún valor almacenado en esa columna. Sin embargo, un valor null puede presentar desafíos cuando se trabaja con código ASP.NET o con controles web enlazados a datos. Por ejemplo, cuando se intenta enlazar SelectedValue de un control DropDownList a null, se inicia una excepción.

ASP.NET proporciona funcionalidad integrada para trabajar con valores null. Si la situación no se resuelve utilizando las funciones integradas de ASP.NET, hay algunas técnicas adicionales que puede utilizar para trabajar con valores null.

Propiedad NullDisplayText

Puede establecer la propiedad NullDisplayText de campos enlazados de controles de origen de datos (como los objetos BoundField, CheckBoxField y ImageField) para que reemplace los valores null devueltos por el origen de datos por un valor concreto (como una cadena). Los controles mostrarán ese valor como el texto del control enlazado. Cuando se modifica una fila enlazada a datos durante una operación de edición, si el valor de un campo enlazado coincide con NullDisplayText (ya sea porque no se modificó el valor o porque el usuario especificó el mismo valor que NullDisplayText), el campo pasa el valor null al origen de datos. Si la propiedad NullDisplayText no está establecida, los valores null se muestran como cadenas vacías ("").

Por ejemplo, si se establece la propiedad NullDisplayText de un objeto BoundField en "(ningún valor)" y si la columna de datos enlazada es null, la propiedad Text de los objetos Label o TextBox representados por el objeto BoundField se establece en "(ningún valor)". Si el usuario edita la fila y cambia el valor de "(ningún valor)" a "Valor personalizado", se pasa el valor "Valor personalizado" al origen de datos como el valor del campo. Pero si el valor del control enlazado todavía sigue siendo "(ningún valor)", el control de datos pasa null al origen de datos como valor del campo.

Propiedad ConvertEmptyStringToNull

Los objetos Parameter, los objetos TemplateField y los campos enlazados (objetos BoundField, CheckBoxField, ImageField y AutoGeneratedField) admiten una propiedad ConvertEmptyStringToNull que determina cómo el objeto tratará los valores de cadena vacía ("") durante las operaciones de actualización, inserción o eliminación. Si la propiedad ConvertEmptyStringToNull es true para un objeto, y si el valor de ese objeto es una cadena vacía, el objeto pasa el valor null al origen de datos. Si la propiedad ConvertEmptyStringToNull de un objeto es false y el valor del objeto es una cadena vacía, se pasa una cadena vacía al origen de datos como valor del objeto.

Convertir Null en los campos de plantilla

El objeto TemplateField no tiene una propiedad NullDisplayText, porque la plantilla podría contener varios campos enlazados. Sin embargo, puede crear su propio procedimiento de control de null para un campo enlazado y, a continuación, pasar el valor enlazado a datos al procedimiento mediante sintaxis de enlace de datos unidireccional, utilizando el método Eval. Para los escenarios de enlace de datos bidireccional, gracias a los métodos Bind y Eval puede utilizar un control DropDownList con la propiedad AppendDataBoundItems establecida en true, como se muestra en el ejemplo siguiente.

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

Cuando la propiedad AppendDataBoundItems está establecida en true, el control DropDownList se rellena con elementos estáticos y datos generados a partir del origen de datos. El elemento de lista estático que se agrega al control DropDownList tiene la propiedad Value establecida en una cadena vacía. Con este valor, un elemento de datos que contiene un valor null se enlaza al elemento de lista estático.

Para obtener más información acerca de los métodos Eval y Bind, vea Información general sobre las expresiones de enlace de datos.

Técnicas para trabajar con Null mediante el control ObjectDataSource

Cuando se crea un objeto para que actúe como origen de un control ObjectDataSource, se puede administrar la conversión de valores null dentro del código del objeto. Existen dos opciones disponibles: los tipos que aceptan valores NULL y las anotaciones para objetos con establecimiento inflexible de tipos, como los conjuntos de datos.

Nota:

Para obtener más información sobre el control ObjectDataSource, vea Información general sobre el control de servidor web ObjectDataSource.

Utilizar tipos que aceptan valores NULL

Cuando se crean los métodos select, insert, update y delete del objeto de origen de datos de un control ObjectDataSource, si el valor del parámetro puede ser null en el origen de datos, puede definir parámetros y devolver valores para esos métodos como tipos que aceptan valores NULL. Los tipos que aceptan valores NULL son valores de tipo Integer o Boolean que pueden tener valores normales o el valor null.

Para obtener más información sobre cómo utilizar tipos que aceptan valores NULL con Visual Basic, vea Tipos de valor que aceptan valores NULL. Para obtener más información sobre cómo utilizar tipos que aceptan valores NULL con C#, vea Utilizar tipos que aceptan valores NULL (Guía de programación de C#).

Anotar un conjunto de datos con establecimiento inflexible de tipos

Un objeto de origen común para el control ObjectDataSource es un objeto DataSet con establecimiento inflexible de tipos. Para que un conjunto de datos DataSet con establecimiento inflexible de tipos convierta los valores null devueltos por un origen de datos a un valor especificado por el usuario, se puede anotar el conjunto de datos DataSet con establecimiento inflexible de tipos mediante la anotación nullValue. Para obtener más información, vea Anotar DataSets con establecimiento de tipos (ADO.NET).

Vea también

Conceptos

Información general sobre los controles de origen de datos

Información general sobre los controles de servidor Web ASP.NET enlazados a datos

Información general sobre las expresiones de enlace de datos