I am trying to set up a date range filter on my UI, with checkboxes to say whether a DateTimePicker\'s value should be used, e.g.
Dim fromDate As DateTime? =
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
The issue is that it's examining the right-hand side of this assignment first, and deciding that it is of type DateTime
(no ?
). Then performing the assignment.
This will work:
Dim fromDate As DateTime? = If(fromDatePicker.Checked, _
fromDatePicker.Value, _
CType(Nothing, DateTime?))
Because it forces the right-hand side's type to be DateTime?
.
As I said in my comment, Nothing can be more akin to C#'s default(T)
rather than null
:
Nothing
represents the default value of a data type. The default value depends on whether the variable is of a value type or of a reference type.
In addition to @Damien_The_Unbeliever's fine answer, using New DateTime?
also works:
Dim fromDate As DateTime? = If(fromDatePicker.Checked, _
fromDatePicker.Value, _
New DateTime?)
You might find that it looks a bit counter intuitive, why perhaps the CType(Nothing, DateTime?)
is preferable.
Use New Date
as a magic number:
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
With VB.NET and EF 6.X to save null is:
Dim nullableData As New Nullable(Of Date)