2016-07-25 180 views
-1

VS工作室2012网络快车,ASP.NET,WebForms的,VB,SQLSERVER,有麻烦的DateTime NULL值保存到强类型ROW网页应用:如何将空日期时间保存到SqlServer数据库?不工作

 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控件模板字段文本框是< blank>或空或“”,BLL函数将其显示为如下日期:#01/01/0001#。所以我测试传入变量的YEAR值,如果小于10,则将DBNull.Value保存到oRowVehicles [WElectrical],但由于datatype = Date而失败,并且无法将DBNull转换为Date。

DB字段是Date类型并允许空值。

TableAdapter.xsd视图显示默认值为< DBNULL>。

那么,为什么oRowVehicles不能日期为空?

如何使WElectrical列可以为空?

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

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

编辑 ASPX代码DATE一个在DetailsView(其它类似)域:在ASPX

   <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对象的参数定义。

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

BLL代码:对于上面的代码

的WElectrical参数进入该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 

编辑评论是用#01 /的值的DATE 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

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

+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

看起来你正在使用表格适配器。 YOu需要将该参数设置为AllowNulls:https://msdn.microsoft.com/en-us/library/ms233762.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1 –

回答

0

感谢上述问题的所有评论者。 解决方法是将Row-column-variable更改为将句子转换为Nothing的句子? (可为空)如下...

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

和 - 改变了数据集列定义(在的.xsd)如下:

数据类型==> System.Object的(没有日期)

NullValue属性==>(没有)(未抛出异常)

衷心感谢所有贡献者 - 因为每个献计献策的元素都对这一解决方案做出了贡献。
这是将可为空的值发送到DataRow列的解决方案。

谢谢你的一切帮助。

+0

您应该将此标记为已接受的答案,以便您的问题不会被解决。 – Andrew

+0

谢谢@安德鲁 - 我该怎么做?我将其标记为绿色复选标记。这可以吗? –

+0

确实,做得很好。 :) – Andrew

0

做一个事情:

变化DBNull.Value为Nothing

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

设置为空值>> Nothing

+0

谢谢你的回答。我确实将DBNull.Value更改为Nothing,这让我越过了无法转换为Date类型的错误。然而,其他建议并没有消除获得#01/01/0001#的BIND值的问题,实际上可能在我的用户控制屏幕上的日期输入。现在真正的问题是为什么#01/01/0001#被保存到Sql-DB而不是NULL。我会就此回复你。谢谢。 –

+0

发布您的代码,以便我们可以找到问题所在。在绑定之前,您可能需要检查该值是否大于“DateTime.MinDate”。 – Andrew

+0

添加代码片段 - 欢迎您的评论...谢谢。 –

相关问题