Asp.net 如何使DateTime的值为NULL?

Asp.net 如何使DateTime的值为NULL?,asp.net,.net,vb.net,visual-studio,Asp.net,.net,Vb.net,Visual Studio,在我的SQL数据库中,我将DpsDate和AdmDate声明为DATE,并将它们设置为允许空值。当我运行应用程序并将这些列留空时,会出现以下错误: 无法将参数值从字符串转换为日期时间 这就是我有点困惑的地方,因为我已经将它们设置为允许null,所以数据库不应该接受no值吗?如果我将两个日期都设置为“01/01/1900”,则应用程序可以运行。我尝试将它们设置为“00/00/0000”,但得到了相同的错误 以下是我所拥有的: If tbNotifyDate.Text = "" Th

在我的SQL数据库中,我将
DpsDate
AdmDate
声明为
DATE
,并将它们设置为允许空值。当我运行应用程序并将这些列留空时,会出现以下错误:

无法将参数值从字符串转换为日期时间

这就是我有点困惑的地方,因为我已经将它们设置为允许null,所以数据库不应该接受no值吗?如果我将两个日期都设置为“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

您需要在ADO.NET中使用
DBNull.Value
来表示
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
不是相同的类型。通过将一个可能的结果转换为type
Object
,它们都被解释为type
Object
,编译器很高兴


请注意,正如我所写的示例,如果
文本框
包含任何不是
日期
有效表示形式的内容,则这将保存
NULL
。您可以在特定情况下使用任何适当的验证,或者,如果您已经验证,只需检查一个空的
文本框
,并使用
CDate

在ADO.NET中使用
DBNull.Value
表示
NULL
,而不考虑数据类型。为什么要将
date
参数的大小指定为50?使用实际大小(零)或不设置大小。您只需要为可变宽度数据类型指定大小,例如
varchar
。示例中经常使用50,因为这是
varchar
等的默认值,但将其用于
date
字段会产生误导。可能重复