Обработка значений NULL базы данных с помощью элементов управления источниками данных
Обновлен: Ноябрь 2007
В большинстве случаев столбцы таблиц базы данных возвращают значение null, если в данном столбце отсутствует значение. Однако значение null может вызвать определенные затруднения при работе с кодом ASP.NET или с веб-элементами управления с привязкой к данным. Например, при попытке привязать свойство SelectedValue элемента управления DropDownList к значению null возникнет исключение.
ASP.NET предоставляет встроенные функциональные возможности для работы со значениями null. Если затруднения, возникшие в вашем случае, не решены с помощью встроенных возможностей ASP.NET, то имеется несколько дополнительных методик, которые можно использовать при работе со значениями null.
Свойство NullDisplayText
Можно задать свойство NullDisplayText привязанных полей в элементах управления источниками данных (таких как объекты BoundField, CheckBoxField и ImageField) для замены значений null, возвращаемых источником данных, определенным значением (например, строкой). При таком подходе элементы управления отобразят это значение как текст привязанного элемента управления. Когда строка с привязкой к данным изменяется во время операции редактирования, то, если значение для привязанного поля совпадает с NullDisplayText (независимо от того, было ли значение изменено или пользователь ввел то же значение, что и в NullDisplayText), то поле передает значение null источнику данных в виде значения поля. Если свойство NullDisplayText не задано, значения null отображаются как пустые строки ("").
Например, если задать для свойства NullDisplayText объекта BoundField значение "(нет значения)" и если столбцом привязанных данных является null, то свойству Text объектов Label или TextBox, отображаемых объектом BoundField, будет присвоено значение "(нет значения)". Если пользователь при изменении строки и изменит значение с "(нет значения)" на "Пользовательское значение", то значение "Пользовательское значение" передается источнику данных как значение поля. Но если значение привязанного элемента управления остается "(нет значения)", то элемент управления данных передает значение null источнику данных как значение поля.
Свойство ConvertEmptyStringToNull
Объекты Parameter, объекты TemplateField, и привязанные поля (объекты BoundField, CheckBoxField, ImageField и AutoGeneratedField) поддерживают свойство ConvertEmptyStringToNull, определяющее, как объект будет обрабатывать пустую строку ("") во время операций обновления, вставки и удаления. Если свойство ConvertEmptyStringToNull объекта имеет значение true и если значение для этого объекта является пустой строкой, то объект передает значение null источнику данных как значение объекта. Если свойство ConvertEmptyStringToNull объекта имеет значение false и если значение этого объекта является пустой строкой, то пустая строка передается источнику данных как значение объекта.
Преобразование значений NULL в полях, являющихся шаблонами
Объект TemplateField не имеет свойства NullDisplayText, так как шаблон может содержать несколько привязанных полей. Однако можно создать свою собственную процедуру обработки значения null для привязанного поля и передать значение с привязкой к данным процедуре с синтаксисом односторонней привязки данных, используя метод Eval. При двусторонней привязке данных к элементу управления с использованием методов Eval и Bind можно использовать элемент управления DropDownList, у которого для свойства AppendDataBoundItems установлено значение true, как показано в следующем примере.
<%@ 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 runat="server">
<title>Northwind Employees</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" 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" runat="server" 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" runat="server" 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" runat="server" 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" runat="server" 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 runat="server">
<title>Northwind Employees</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" 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" runat="server" 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" runat="server" 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" runat="server" 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" runat="server" ConnectionString="<%$ ConnectionStrings:Northwind %>"
SelectCommand="SELECT EmployeeID, LastName + ', ' + FirstName As Name From Employees">
</asp:SqlDataSource>
</div>
</form>
</body>
</html>
Если для свойства AppendDataBoundItems установлено значение true, элемент управления DropDownList заполняется как статическими элементами, так и данными, которые поступают из источника данных. У статического элемента списка, добавленного в элемент управления DropDownList, свойствоValue равно пустой строке. Таким образом, элемент данных, содержащий значение NULL, привязывается к статическому элементу списка.
Дополнительные сведения см. в описаниях методов Eval, Bind и Общие сведения о выражениях для привязки данных.
Методики работы со значением NULL, использующие элемент управления ObjectDataSource
При создании объекта, действующего как исходный, для элемента управления ObjectDataSource можно управлять преобразованием значений null внутри кода объекта. Доступно два варианта: типы, допускающие значения NULL, и аннотации для строго типизированных объектов, таких как наборы данных.
Примечание. |
---|
Дополнительные сведения об элементе управления ObjectDataSource см. в разделе Общие сведения о серверном веб-элементе управления ObjectDataSource. |
Использование типов, допускающих значение NULL
При создании методов выбора, вставки, обновления и удаления исходного объекта для элемента управления ObjectDataSource, если значение параметра может принимать значение null в источнике данных, то можно определить параметры и возвращаемые значения для этих методов как типы, допускающие значение NULL. Типы, допускающие значение NULL, такие как целое число или логическое значение, могут быть либо регулярным значением, либо значением null.
Дополнительные сведения об использовании типов, допускающих значение NULL, в Visual Basic, см. в разделе Типы значения Null. Дополнительные сведения об использовании типов, допускающих значение NULL, в C#, см. в разделе Использование допускающих значение NULL типов (руководство по программированию на C#).
Добавление аннотаций к строго типизированному набору данных
Распространенным исходным объектом для элемента управления ObjectDataSource является строго типизированный объект DataSet. Чтобы настроить строго типизированный DataSet на преобразование значений null, возвращаемых источником данных, в определенное значение, можно добавить аннотации к строго типизированному DataSet, использовав при этом аннотации nullValue. Дополнительные сведения см. в разделе Добавление заметок к типизированным объектам DataSet (ADO.NET).
См. также
Основные понятия
Общие сведения об элементах управления источниками данных
Общие сведения о серверных веб-элементах управления ASP.NET с привязкой к данным