在我的SQL数据库中,我已经将DpsDate
和AdmDate
声明为DATE
,也将它们设置为允许空值。当我运行我的应用程序并将这些列留空时,出现此错误:
无法将参数值从字符串转换为DateTime。
这是我有点困惑的地方,因为我将它们设置为允许空值,所以数据库不应该不接受任何值吗?如果我将两个日期都设置为“ 01/01/1900”,则该应用程序有效。我尝试将它们设置为“ 00/00/0000”,但出现相同的错误。
这就是我所拥有的:
If tbNotifyDate.Text = "" Then
cmd.Parameters.Add("@DpsDate", SqlDbType.Date, 50).Value = "01/01/1900"
Else
cmd.Parameters.Add("@DpsDate", SqlDbType.Date, 50).Value = tbNotifyDate.Text
End If
If tbAdmDate.Text = "" Then
cmd.Parameters.Add("@AdmDate", SqlDbType.Date, 50).Value = "01/01/1900"
Else
cmd.Parameters.Add("@AdmDate", SqlDbType.Date, 50).Value = tbAdmDate.Text
End If
答案 0 :(得分:2)
您需要使用DBNull.Value
来表示ADO.NET中的NULL
。在ADO.NET之上构建的表适配器和实体框架之类的东西可以支持可空值类型,因此使用Nothing
来表示NULL
,但是ADO.NET本身早于可空值类型,因此Microsoft必须专门创建一种类型来表示NULL
。
我建议使用If
运算符使代码更简洁:
Dim value As Date
cmd.Parameters.Add("@AdmDate", SqlDbType.Date).Value = If(Date.TryParse(tbAdmDate.Text, value),
value,
CObj(DBNull.Value))
CObj
是必需的,因为If
的两个可能结果必须是同一类型,而Date
和DBNull
却不是同一类型。通过将一个可能的结果强制转换为类型Object
,它们都将被解释为类型Object
,并且编译器很高兴。
请注意,正如我所写的那样,如果NULL
包含不是TextBox
的有效表示形式的任何内容,则将节省Date
。您可以使用适合您特定情况的任何验证方式,或者,如果您已经验证过,则只需检查空白TextBox
并使用CDate
。