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
?
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.
Avec VB.NET et EF 6.X, enregistrer null signifie:
Dim nullableData As New Nullable(Of Date)
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.
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
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