如何将空日期时间保存到SqlServer DB?不工作

时间:2016-07-25 17:54:08

标签: asp.net sql-server datetime nullable bll

VS-Studio 2012 Web Express,ASP.NET,WebForms,VB,SqlServer,WebSite应用程序在将DateTime的NULL值保存到强类型ROW时遇到问题:

      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模板字段文本框是&lt;空白&GT;或者为空或“”,BLL功能将其显示为日期,如:#01/01/0001#。因此,如果小于10,则测试传入变量的YEAR值,然后将DBNull.Value保存到oRowVehicles。[WElectrical]但由于datatype = Date而无法将DBNull转换为Date。

DB-field是Date类型,允许空值。

TableAdapter.xsd视图显示默认值为&lt;的DBNull&GT;

那么,为什么oRowVehicles不是Date可以为空?

如何让WElectrical列可以为空?DATE?

我必须忽略一些东西,因为我不能是唯一一个将可选的DATE值保存到Sql-DB的人。

欢迎您提出意见和解决方案。谢谢...约翰

修改 ASPX代码在DetailsView中的一个DATE字段(其他类似):

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

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

修改上述代码的评论

进入BLL功能的WElectrical参数是DATE,其值为#01/01/0001#。
将值放入ROW对象的代码

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

将row-object-field-value设置为Nothing。

Adapter.Update(odtVEHICLES)更新Sql-DB。

那么是什么导致#01/01/0001#值被放入Sql-DB?

Sql-DB列定义

enter image description here

////////编辑结束///////////

2 个答案:

答案 0 :(得分:0)

做一件事:

将DBNull.Value更改为Nothing

或者,您可以将数据集中的数据类型更改为System.Object,和 转到该数据colm的属性 然后你可以在下拉列表中选择'(Nothing)'。

将Null值设置为&gt;&gt;没有

答案 1 :(得分:0)

感谢所有评论员对上述问题的回答。 解决方案是将Row-column-variable更改为这句话,将Nothing转换为Date? (可以为空)如下......

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

AND - 更改了数据集列定义(在.xsd中),如下所示:

DataType ==&gt; System.Object(不是日期)

NullValue ==&gt; (没什么)(不是抛出异常)

衷心感谢所有贡献者 - 因为他们的每个建议的要素都为这个解决方案做出了贡献 这是将可空值发送到DataRow列的解决方案。

感谢您的帮助。