web-dev-qa-db-fra.com

Comment définir un DateTime nullable sur null dans VB.NET?

J'essaie de configurer un filtre de plage de dates sur mon interface utilisateur, avec des cases à cocher pour indiquer si une valeur DateTimePicker doit être utilisée, par exemple.

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

Cependant, définir fromDate sur Nothing n'entraîne pas sa définition sur Nothing mais sur '12: 00: 00 AM ', et l'instruction If suivante exécute le filtre de manière incorrecte car startDate n'est pas Nothing.

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

Comment puis-je vraiment m'assurer que startDate obtient une valeur de Nothing?

15
ProfK

Le problème est qu'il examine d'abord le côté droit de cette affectation et décide qu'il s'agit d'un type DateTime (no ?). Puis effectuer la mission.

Cela fonctionnera:

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

Parce que cela force le type du côté droit à être DateTime?.

Comme je l'ai dit dans mon commentaire, Nothing peut ressembler davantage à default(T) de C # plutôt qu'à null:

Nothing représente la valeur par défaut d'un type de données. La valeur par défaut varie selon que la variable est d'un type valeur ou d'un type référence.

25

Avec VB.NET et EF 6.X, enregistrer null signifie:

Dim nullableData As New Nullable(Of Date)

3
danicomas

En plus de la bonne réponse de @ Damien_The_Unbeliever, utiliser New DateTime? fonctionne également:

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

Vous trouverez peut-être que cela semble un peu contre-intuitif, alors pourquoi la fonction CType(Nothing, DateTime?) est préférable.

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

Utilisez New Date comme nombre magique:

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