Как установить значение NULL DateTime для null в VB.NET?
Я пытаюсь настроить фильтр диапазона дат в моем пользовательском интерфейсе с помощью флажков, чтобы указать, должно ли использоваться значение 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
?
Ответы
Ответ 1
Проблема в том, что сначала он рассматривает правую часть этого назначения и решает, что он имеет тип DateTime
(no ?
). Затем выполнение задания.
Это будет работать:
Dim fromDate As DateTime? = If(fromDatePicker.Checked, _
fromDatePicker.Value, _
CType(Nothing, DateTime?))
Потому что это заставляет правую сторону быть DateTime?
.
Как я уже сказал в своем комментарии, Nothing
может быть более сродни С# default(T)
, а не null
:
Nothing
представляет значение по умолчанию для типа данных. Значение по умолчанию зависит от того, имеет ли переменная тип значения или ссылочный тип.
Ответ 2
В дополнение к @Damien_The_Unbeliever прекрасный ответ, использование New DateTime?
также работает:
Dim fromDate As DateTime? = If(fromDatePicker.Checked, _
fromDatePicker.Value, _
New DateTime?)
Вы можете обнаружить, что он выглядит немного интуитивно понятным, почему возможно CType(Nothing, DateTime?)
предпочтительнее.
Ответ 3
С VB.NET и EF 6.X для сохранения null:
Dim nullableData As New Nullable(Of Date)
Ответ 4
Используйте 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
Ответ 5
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