将空值插入日期字段?

Sar*_*ara 7 sql vb.net asp.net ms-access

我有一个FormView,我从一个表(MS Access)中提取数据,然后将其(加上更多数据)插入另一个表.我对日期有疑问.

第一个表有两个日期字段:date_submitteddate_updated.在某些记录中,date_updated是空白的.这会导致我在尝试插入第二个表时出现数据不匹配错误.

这可能是因为我date_updated将第一个表中的字段数据绑定到FormView上的HiddenField中.然后它从HiddenField获取值并尝试将其插入第二个表:

Dim hfDateRequestUpdated As HiddenField = FormView1.FindControl("hfDateRequestUpdated")
myDateRequestUpdated = hfDateRequestUpdated.Value
'... It then attempts to insert myDateRequestUpdated into the database.
Run Code Online (Sandbox Code Playgroud)

当有值时,它可以工作,但显然你不能在Access中的日期/时间字段中插入任​​何内容.我想我可以制作一个不插入的第二个插入语句date_updated(在没有值时使用date_updated),但这是唯一的方法吗?似乎应该有一个更容易/更少冗余的方式.

编辑:

好的.所以我尝试插入SqlDateTime.Null,Nothing和DBNull.Value.SqlDateTime.Null导致将值1/1/1900插入数据库."没什么"导致它插入1/1/2001.如果我尝试使用DBNull.Value,它告诉我它不能转换为字符串,所以也许我没有在那里做一些事情.无论如何,我希望如果没有任何内容可以插入,Access中的字段将保持空白,但似乎它必须填充一些东西......

编辑:

我有DBNull.Value工作,它确实插入一个完全空白的值.所以这是我最后的工作代码:

Dim hfDateRequestUpdated As HiddenField = FormView1.FindControl("hfDateRequestUpdated")
Dim myDateRequestUpdated = Nothing

If hfDateRequestUpdated.Value = Nothing Then
    myDateRequestUpdated = DBNull.Value
Else
    myDateRequestUpdated = DateTime.Parse(hfDateRequestUpdated.Value)
End If
Run Code Online (Sandbox Code Playgroud)

感谢大家!

Ala*_*ain 3

Sara,您在更新之前尝试过投射日期/时间吗?数据不匹配错误可能来自以下事实:hfDateRequestUpdated.Value您尝试插入数据库的数据与列类型不匹配所致。

尝试单步执行代码并查看该值的类型。如果您发现它是一个字符串(看起来可能是一个字符串,因为它来自表单上的字段),那么您需要首先检查该字段是否为空字符串 ( VBNullString)。如果是这样,您将需要将插入数据库的值更改为DBNull,您可以使用 VB.Net 获取该值DBNull.Value

我们看不到您的代码,因此我们不确切知道如何将值存入数据库,但它看起来像这样

If theDateValueBeingInserted is Nothing Then
    theDateValueBeingInserted = DBNull.Value
EndIf
Run Code Online (Sandbox Code Playgroud)

请记住,上述测试仅在从 HiddenField 获取的值是字符串时才有效,我相信这是根据文档。这可能就是你所遇到的所有麻烦的根源。您隐式地将日期/时间值转换为字符串(这很容易),但隐式将它们转换回来并不那么容易,特别是如果初始值是DBNull


在旁边

我认为 Marshall 试图建议的内容与上面的代码等效,但是在一个名为“三元运算符”的快捷表达式中,在 VB.Net 中如下所示:

newValue = IF(oldValue is Nothing ? DBNull.Value : oldValue)
Run Code Online (Sandbox Code Playgroud)

不过我不推荐它,因为它会让新程序员感到困惑,而且语法在 2008 年从IFF(condition ? trueResult : falseResult)