如何为DateTime设置NULL值?

时间:2019-01-09 04:41:37

标签: asp.net .net vb.net visual-studio

在我的SQL数据库中,我已经将DpsDateAdmDate声明为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

1 个答案:

答案 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的两个可能结果必须是同一类型,而DateDBNull却不是同一类型。通过将一个可能的结果强制转换为类型Object,它们都将被解释为类型Object,并且编译器很高兴。

请注意,正如我所写的那样,如果NULL包含不是TextBox的有效表示形式的任何内容,则将节省Date。您可以使用适合您特定情况的任何验证方式,或者,如果您已经验证过,则只需检查空白TextBox并使用CDate