cs_JMO
Messages postés1854Date d'inscriptionjeudi 23 mai 2002StatutMembreDernière intervention24 juin 2018
-
15 avril 2017 à 19:15
cs_JMO
Messages postés1854Date d'inscriptionjeudi 23 mai 2002StatutMembreDernière intervention24 juin 2018
-
16 avril 2017 à 17:39
Bonjour le Forum,
Je n'arrive pas à extraire d'une base Access les champs de type Date non renseignés (vides).
Déclaration résumée
Public Class Personnel
Public Property Employe As String
Public Property Nom As String
Public Property Prenom As String
Public Property DateDebutProjet As Date
Public Property DateFinProjet As Date
End Class
Dans le formulaire
ListePersonnel = (
From row In dtPersonnel.AsEnumerable()
Order By row.Field(Of String)("Nom"), row.Field(Of String)("Prenom") Ascending
Select New Personnel With {
.Employe = row.Field(Of String)("Nom").ToUpper & New String(" "c, 1) & _
row.Field(Of String)("Prenom").Substring(0, 1).ToUpper(Globalization.CultureInfo.CurrentCulture) & _
row.Field(Of String)("Prenom").Substring(1).ToLower(Globalization.CultureInfo.CurrentCulture),
.DateDebutProjet = row.Field(Of Date)("Date_de_demarrage_Projet"),
.DateFinProjet = row.Field(Of Date)("Date_de_Fin_Projet")
}).ToList
J'ai beau parcourir MSDN et les informations sur l'erreur
Une exception non gérée du type 'System.InvalidCastException' s'est produite dans System.Data.DataSetExtensions.dll Informations supplémentaires : Impossible d'effectuer un cast de DBNull.Value vers le type 'System.DateTime'. Utilisez un type Nullable.
Je n'arrive pas à faire une fonction qui va tester si le champ "DateFinProjet" est renseigné ou vide et donc retourné soit la date soit un Nullable.
Whismeril
Messages postés18304Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 1 avril 2023622 16 avril 2017 à 00:55
Je viens de rentrer.
J'ai regardé, via un traducteur, un datetime nullable se définit comme ça
Dim datenullable? As DateTime
Donc ta première option est de déclarer ta propriété comme ça
Public Property datenullable() As DateTime?
cependant un datetime nullable n'est pas très pratique à utliser.
En C#, il existe l'opérateur conditionnel qui revient à affecter une valeur d'une façon si une condition est respectée et d'une autre sinon. Et toujours en C#, cet opérateur marche dans les requêtes Linq.
Cet opérateur a un équivalent en VB.Net qui est
Dim toto As DateTime = If(truc IsNot Nothing, truc, New DateTime())
Je n'ai pas essayé de Linq avec, mais y a pas de raison.
Par contre, c'est pas truc isnot nothing que tu dois tester, mais si le champ de ta base de données est rempli ou pas.
Je n'ai pas Acccès à la maison et n'y ai pas touché depuis plus de 10 ans, donc je ne suis sûr de rien, mais il me semble qu'il faut utiliser IsDBNull
cs_JMO
Messages postés1854Date d'inscriptionjeudi 23 mai 2002StatutMembreDernière intervention24 juin 201826 16 avril 2017 à 09:13
Bonjour Whismeril,
Merci pour tes explications.
Dans la classe, j'ai déclaré Public Property DateFinProjet() As DateTime? et
Function returnDateTime(ByVal var As Date) As Date
Dim myDate? As DateTime = var
If myDate.HasValue Then
MessageBox.Show("var est une date " & CStr(myDate))
Else
MessageBox.Show("var n'est pas une date")
End If
' try with the empty string, then try with DateTime.Now.ToString
'myDate = If(String.IsNullOrEmpty(var), CType(Nothing, DateTime?), DateTime.Parse(var))
myDate = If(Not myDate.HasValue, CType(Nothing, DateTime?), DateTime.Parse(var))
Return myDate
End Function
Cela me retourne la date quand celle-ci est renseignée mais plante quand le champ est vide (avec le même message d'erreur pré-cité) sans m'afficher le messagebox (var n'est pas une date).
Pour le DBNull, il faut utiliser la référence Microsoft.VisualBasic d'après MSDN;
Whismeril
Messages postés18304Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 1 avril 2023622 16 avril 2017 à 12:27
Salut, à 1h du mat j'avais pas les yeux en face des trous, et du coup je ne me suis pas demandé s'il y avait une subtilité avec l'endroit ou se trouve le ?, à vérifier donc.
Pour le "if en ligne", c'est dans ta requete linq qu'il faudrait tester
un truc comme ça peut être.
cs_JMO
Messages postés1854Date d'inscriptionjeudi 23 mai 2002StatutMembreDernière intervention24 juin 201826
>
Whismeril
Messages postés18304Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 1 avril 2023 16 avril 2017 à 14:30
Whismeril,
Toujours avec Public Property DateFinProjet() As DateTime? et
.DateFinProjet = If(Not String.IsNullOrEmpty(row.Field(Of Date)("Date_de_Fin_Projet").ToString()), _
row.Field(Of Date)("Date_de_Fin_Projet"), New DateTime())
J'obtiens la même erreur : Impossible d'effectuer un cast de DBNull.Value vers le type 'System.DateTime'. Utilisez un type Nullable.
Whismeril
Messages postés18304Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 1 avril 2023622
>
cs_JMO
Messages postés1854Date d'inscriptionjeudi 23 mai 2002StatutMembreDernière intervention24 juin 2018 16 avril 2017 à 16:05
Public Property DateFinProjet() As DateTime?
non avec le datetime "normal"
Note que dans mon exemple, j'ai viré le Of Date du test, je ne l'ai mis que si le test à réussi.
cs_JMO
Messages postés1854Date d'inscriptionjeudi 23 mai 2002StatutMembreDernière intervention24 juin 201826
>
Whismeril
Messages postés18304Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 1 avril 2023 16 avril 2017 à 17:13
15 avril 2017 à 20:41
Merci, je vais examiner ce lien.
Bonne soirée,