Condividi tramite


Gestione dei valori Null del database tramite controlli origine dati

Aggiornamento: novembre 2007

In molti casi, le colonne nelle tabelle di un database restituiscono null se non è memorizzato alcun valore in tali colonne. Tuttavia, un valore null può presentare particolari difficoltà quando si utilizza codice ASP.NET o controlli Web con associazione a dati. Viene ad esempio generata un'eccezione se si tenta di associare il valore SelectedValue di un controllo DropDownList a null.

ASP.NET offre alcune funzionalità incorporate per utilizzare valori null. Se le difficoltà non vengono superate utilizzando le funzionalità incorporate di ASP.NET, esistono alcune tecniche aggiuntive che consentono di utilizzare valori null.

Proprietà NullDisplayText

È possibile impostare la proprietà NullDisplayText di campi associati nei controlli origine dati (ad esempio gli oggetti BoundField, CheckBoxField e ImageField) per sostituire un valore specifico (ad esempio una stringa) per i valori null restituiti dall'origine dati. I controlli visualizzeranno quindi tale valore come testo del controllo associato. Quando una riga con associazione a dati viene modificata durante un'operazione di modifica, se il valore di un campo associato corrisponde alla proprietà NullDisplayText (sia che il valore non sia stato modificato o che l'utente abbia immesso lo stesso valore della proprietà NullDisplayText), il campo passa null all'origine dati come valore del campo. Se la proprietà NullDisplayText non è impostata, i valori null vengono visualizzati come stringhe vuote ("").

Se ad esempio si imposta la proprietà NullDisplayText per un oggetto BoundField su "(no value)" e se la colonna con associazione a dati è null, la proprietà Text degli oggetti Label e TextBox sottoposti a rendering dall'oggetto BoundField viene impostata su "(no value)". Se l'utente modifica la riga e il valore da "(no value)" a "Custom Value", il valore "Custom Value" viene passato all'origine dati come valore del campo. Ma se il valore del controllo associato è ancora "(no value)", il controllo dati passa null all'origine dati come valore del campo.

Proprietà ConvertEmptyStringToNull

Gli oggetti Parameter e TemplateField e i campi associati (oggetti BoundField, CheckBoxField, ImageField e AutoGeneratedField) supportano una proprietà ConvertEmptyStringToNull che determina il modo in cui l'oggetto tratterà i valori di stringa vuota ("") durante le operazioni di aggiornamento, inserimento ed eliminazione. Se la proprietà ConvertEmptyStringToNull è true per un oggetto e se il valore di tale oggetto è una stringa vuota, l'oggetto passa null all'origine dati come valore dell'oggetto. Se la proprietà ConvertEmptyStringToNull è false per un oggetto e se il valore di tale oggetto è una stringa vuota, una stringa vuota verrà passata all'origine dati come valore dell'oggetto.

Conversione del valore Null in campi modello

L'oggetto TemplateField non ha una proprietà NullDisplayText, perché il modello può contenere più campi associati. Tuttavia, è possibile creare una procedura di gestione dei valori null personalizzata per un campo associato e passare il valore con associazione a dati nella procedura con una sintassi di associazione dati unidirezionale, mediante il metodo Eval. Per gli scenari di associazione dati bidirezionale, mediante i metodi Eval e Bind, è possibile utilizzare un controllo DropDownList con la proprietà AppendDataBoundItems impostata su true, come illustrato nell'esempio riportato di seguito.

<%@ 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 la proprietà AppendDataBoundItems è impostata su true, il controllo DropDownList viene popolato con voci statiche e dati generati dall'origine dati. La voce di elenco statica aggiunta al controllo DropDownList presenta la proprietà Value impostata su una stringa vuota. Con tale impostazione, un elemento dati che contiene un valore null viene associato alla voce di elenco statica.

Per ulteriori informazioni sui metodi Eval e Bind, vedere Cenni preliminari sulle espressioni di associazione dati.

Tecniche per l'utilizzo di valori Null mediante il controllo ObjectDataSource

Quando si crea un oggetto che deve fungere da origine per un controllo ObjectDataSource, è possibile gestire la conversione di valori null all'interno del codice dell'oggetto. Due opzioni sono disponibili: tipi nullable e annotazioni per oggetti fortemente tipizzati quali dataset.

Nota:

Per ulteriori informazioni sul controllo ObjectDataSource, vedere Cenni preliminari sul controllo server Web ObjectDataSource.

Utilizzo di tipi nullable

Quando si creano i metodi di selezione, inserimento, aggiornamento ed eliminazione metodi dell'oggetto di origine per un controllo ObjectDataSource, se il valore del parametro può essere null nell'origine dati, è possibile definire parametri e restituire valori per tali metodi come tipi nullable. I tipi nullable sono tipi di valore integer o Boolean che possono avere un valore normale o un valore null.

Per ulteriori informazioni sull'utilizzo di tipi nullable in Visual Basic, vedere Tipi di valori nullable. Per informazioni sull'utilizzo di tipi nullable in C#, vedere Utilizzo dei tipi nullable (Guida per programmatori C#).

Annotazione di un dataset fortemente tipizzato

Un oggetto di origine comune per il controllo ObjectDataSource è un oggetto DataSet fortemente tipizzato. Affinché un oggetto DataSet fortemente tipizzato converta valori null restituiti da un'origine dati in un valore specificato, è possibile annotare l'oggetto DataSet fortemente tipizzato utilizzando l'annotazione nullValue. Per ulteriori informazioni, vedere la classe Inserimento di annotazioni in DataSet tipizzati (ADO.NET).

Vedere anche

Concetti

Cenni preliminari sui controlli origine dati

Cenni preliminari sui controlli server Web ASP.NET con associazione a dati

Cenni preliminari sulle espressioni di associazione dati