web-dev-qa-db-ja.com

VB.NETでnull許容のDateTimeをnullに設定するにはどうすればよいですか?

DateTimePickerの値を使用するかどうかを確認するチェックボックスを使用して、UIに日付範囲フィルターを設定しようとしています。

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

ただし、fromDateNothingに設定しても、Nothingに設定されますが、'12:00:00 AM 'に設定され、その後にIfが設定されます。 startDateNothingではないため、ステートメントはフィルターを誤って実行します。

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

startDateNothingの値を取得するようにするにはどうすればよいですか?

16
ProfK

問題は、最初にこの割り当ての右側を調べ、タイプがDateTime(_?_なし)であることを決定することです。次に、割り当てを実行します。

これは動作します:

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

右側の型を強制的に_DateTime?_にするためです。

私のコメントで述べたように、 Nothingnullではなく、C#のdefault(T)に似ている場合があります。

Nothingは、データ型のデフォルト値を表します。デフォルト値は、変数が値型であるか参照型であるかによって異なります。

26

VB.NETとEF 6.Xでnullを保存するには:

Dim nullableData As New Nullable(Of Date)

3
danicomas

@Damien_The_Unbelieverのすばらしい答えに加えて、_New DateTime?_の使用も機能します。

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

CType(Nothing, DateTime?)が望ましいのはなぜか、直観に反しているように見えるかもしれません。

2
Ulf Åkerstedt
        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
0
Raj

使用する 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
0
SSS