如何在VB.NET中将可为空的DateTime设置为null?

时间:2012-09-26 06:29:58

标签: vb.net vb.net-2010

我正在尝试在我的UI上设置日期范围过滤器,并带有复选框,说明是否应该使用DateTimePicker的值,例如

Dim fromDate As DateTime? = If(fromDatePicker.Checked, fromDatePicker.Value, Nothing)

然而,将fromDate设置为Nothing并不会将其设置为Nothing,而是设置为'12:00:00 AM',以及以下If语句错误地执行了过滤器,因为startDate不是Nothing

If (Not startDate Is Nothing) Then
    list = list.Where(Function(i) i.InvDate.Value >= startDate.Value)
End If

如何确保startDate获得Nothing的值?

5 个答案:

答案 0 :(得分:25)

问题在于,它首先检查此作业的右侧,并确定其类型为DateTime(无?)。然后执行作业。

这将有效:

Dim fromDate As DateTime? = If(fromDatePicker.Checked, _
                               fromDatePicker.Value, _
                               CType(Nothing, DateTime?))

因为它强制右侧的类型为DateTime?

正如我在评论中所说,Nothing可能更类似于C#的default(T)而不是null

  

Nothing表示数据类型的默认值。默认值取决于变量是值类型还是引用类型。

答案 1 :(得分:3)

用VB.NET和EF 6.X保存null是:

Dim nullableData As New Nullable(Of Date)

答案 2 :(得分:2)

除了@ Damien_The_Unbeliever的好答案外,使用New DateTime?也有效:

Dim fromDate As DateTime? = If(fromDatePicker.Checked, _
                               fromDatePicker.Value, _
                               New DateTime?)

您可能会发现它看起来有点反直觉,为什么CType(Nothing, DateTime?)更可取。

答案 3 :(得分:0)

使用New Date作为幻数:

Dim fromDate As New Date
If fromDatePicker.Checked Then
  fromDate = fromDatePicker.Value
End If
If fromDate <> New Date Then
  list = list.Where(Function(i) i.InvDate.Value >= fromDate.Value)
End If

答案 4 :(得分:0)

        squery = "insert into tblTest values('" & Me.txtCode.Text & "', @Date)"
        Dim cmd = New SqlCommand(squery, con)

        cmd.Parameters.Add("@Date", SqlDbType.DateTime)
        If txtRequireDate.Text = "" Then
            cmd.Parameters("@Date").Value = DBNull.Value
        Else
            cmd.Parameters("@Date").Value = txtRequireDate.Text
        End If