2016-07-25 5 views
-1

VS-Studio 2012 Web Express, ASP.NET, WebForms, VB, SqlServer, WebSite приложение Не удалось сохранить значение NULL для DateTime в строго типизированных ROW:Как сохранить нулевое datetime в SqlServer DB? не работает

 Dim oRowVEHICLES As Main_TblAdap.tVEHICLESRow = odtVEHICLES.Rows(0) ' (0) is the first row. 
     oRowVEHICLES.[WElectrical] = If(WElectrical.Year < 10, DBNull.Value, WElectrical) 
...etc... 

В настоящее время DetailsView шаблон поле текстовое поле < пустой> или пустой или "", а функция BLL показывает это как дату: # 01/01/0001 #. Поэтому я тестирую значение YEAR переданного в переменной, если меньше 10, а затем сохраняет DBNull.Value в oRowVehicles. [WElectrical], но не работает с datatype = Date и не может преобразовать DBNull в Date.

Поле DB - это тип Date и допускает null.

В представлении TableAdapter.xsd указано значение по умолчанию: < DBNULL>.

Итак, почему oRowVehicles не Date NULL?

Как я могу сделать WEBC-таблицу нулевой DATE?

Должно быть, что-то не замечаю, потому что я не могу быть единственным, кто сохранит необязательное значение DATE для Sql-DB.

Ваши комментарии и решения приветствуются. Спасибо ... Джон

EDIT ASPX код один DATE поле в DetailsView (другие аналогичные):

   <asp:TemplateField HeaderText="Electrical End Date" SortExpression="WElectrical"> 
       <EditItemTemplate> 
        <TGADate:GADate ID="ucdtWElectrical" runat="server" Enabled="True" MinDate="01/01/1980" MaxDate="12/31/2050" 
         Caption="Electrical End Date" HideCaption="True" Width="100" 
         IsRequired="false" 
         UpdateMode="Conditional" 
         Text='<%# Bind("WElectrical")%>' /> 
       </EditItemTemplate> 
       <InsertItemTemplate> 
        <TGADate:GADate ID="ucdtWElectrical2" runat="server" Enabled="True" MinDate="01/01/1980" MaxDate="12/31/2050" 
         Caption="Electrical End Date" HideCaption="True" Width="100" 
         IsRequired="false" 
         UpdateMode="Conditional" 
         Text='<%# Bind("WElectrical")%>' /> 
       </InsertItemTemplate> 
       <ItemTemplate> 
        <asp:Label ID="lblWElectrical" runat="server" Text='<%# clsGA_Lib1.fnGetDateTextFromObject(Eval("WElectrical"))%>' Style="font-weight: bold;"></asp:Label> 
       </ItemTemplate> 
       <ItemStyle Font-Bold="true" /> 
       </asp:TemplateField> 

Объект определения параметра DataSource в ASPX.

<asp:Parameter Name="WElectrical" Type="DateTime" /> 

BLL Код:

<System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update, False)> _ 
Public Function UpdateFromDetailsView(ByVal original_UID_VEHICLE As Int32, _ 
            ByVal VehicleNbr As String, _ 
...other function parameter variables...  
            ByVal WElectrical As Date, _ 
...other function parameter variables...  
            ) As Boolean 

    ' Get the new VEHICLE-row instance to be updated. 
    Dim odtVEHICLES As Main_TblAdap.tVEHICLESDataTable = Adapter.GetVhclByVhclID(original_UID_VEHICLE) 

    If odtVEHICLES.Count <> 1 Then 
    ' no matching record found, return false 
    Return False 
    End If 

    ' Populate the values of the ROW. 
    Dim oRowVEHICLES As Main_TblAdap.tVEHICLESRow = odtVEHICLES.Rows(0) ' (0) is the first row. 
    With oRowVEHICLES 
    ...setting row-field values... 
    .[WElectrical] = If(WElectrical.Year < 10, Nothing, WElectrical) 
    ...etc... 
    End With 

    ' Update the oRowVEHICLES. 
    Dim rowsAffected As Integer = Adapter.Update(odtVEHICLES) 

    ' Return TRUE if precisely one row was INSERTED, otherwise false. 
    Return CBool(rowsAffected = 1) 
End Function 

Редактировать комментарий для приведенного выше кода

WElectrical параметр, приходящего в BLL-функции является DATE со значением # 01/01/0001 #.
код, чтобы поместить значение в ROW-объекта

.[WElectrical] = If(WElectrical.Year < 10, Nothing, WElectrical) 

мест Ничего как строки-объекта-поля-значения.

Adapter.Update (odtVEHICLES) обновляет Sql-DB.

Так что же заставляет значение # 01/01/0001 # быть помещенным в Sql-DB?

SQL-БД определение столбца

enter image description here

//////// конца Edit ///////////

+0

Если вы имеете дело с объектами .net, используйте 'null' или' Nothing'. Используйте «DBNull» только тогда, когда вы напрямую работаете с базой данных, например, отправляете параметр в запрос или SP. Является ли 'WElectrical' полем типа' DateTime? '? Я не в VB, поэтому вам может понадобиться сделать то, что задано здесь: http://stackoverflow.com/questions/12595775/how-do-i-set-a-nullable-datetime-to-null-in-vb -net – Andrew

+0

Спасибо за этот комментарий. Ссылка очень информативна и очень важна. Я проверю эти изменения и дам вам знать. Спасибо. –

+0

Похоже, вы используете адаптер стола. Вам необходимо установить параметр AllowNulls: https://msdn.microsoft.com/en-us/library/ms233762.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1 –

ответ

0

Спасибо всем комментаторам на поставленный выше вопрос. Решение состоит в том, чтобы изменить переменную Row-column в это предложение, которое отличает Nothing to Date? (Обнуляемый) следующим образом ...

.[WElectrical] = If(WElectrical.Year < 10, CType(Nothing, Date?), WElectrical) 

И - Изменен набор данные столбца четкость (в .xsd) следующим образом:

DataType ==> System.Object (не дата)

NullValue ==> (Nothing) (не бросать исключение)

мою искреннюю благодарность всем оказавшим - поскольку элементы каждого из их предложений внесли свой вклад в это решение.
Это решение для отправки значения NULL в столбец DataRow.

Благодарим за помощь.

+0

Вы должны отметить это как принятый ответ, поэтому ваш вопрос не останется нерешенным. – Andrew

+0

Спасибо @ Andrew - как мне это сделать?Я обозначил его как зеленую отметку. Это нормально? –

+0

Точно, молодец. :) – Andrew

0

сделать одно вещь:

изменения DBNull.Value в настоящий

в качестве альтернативы вы может изменить тип данных в наборе данных на System.Object и перейти к свойствам данных data colm , после чего вы можете выбрать «(Nothing)» в раскрывающемся списке.

набор Null значение >> Ничего

+0

Благодарим вас за ответ. Я изменил DBNull.Value на Nothing, и это заставило меня пройти мимо ошибки, заключающейся в невозможности конвертировать в Date-type. Однако другое предложение не устранило проблему получения значения BIND # 01/01/0001 #, что на самом деле может быть в моем пользовательском элементе управления для ввода даты на экране. Реальная проблема заключается в том, почему # 01/01/0001 # сохраняется в Sql-DB, а не в NULL. Я вернусь к вам по этому поводу. Спасибо. –

+0

Отправьте свой код, чтобы мы могли найти, где проблема. Возможно, вам придется проверить, что перед привязкой значение больше, чем 'DateTime.MinDate'. – Andrew

+0

Добавлены фрагменты кода - ваши комментарии приветствуются ... спасибо. –