Extraction base Access avec Linq d'un champ Date vide [Résolu]

Signaler
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
-
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
-
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.

Je vous remercie de vos suggestions.

jean-marc

3 réponses

Messages postés
15931
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 mai 2021
545
Salut

j'ai pas trop le temps, regarde ça
https://www.dotnetperls.com/nullable-datetime

Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
Bonsoir Whismeril,
Merci, je vais examiner ce lien.

Bonne soirée,
Messages postés
15931
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 mai 2021
545
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

Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26 >
Messages postés
15931
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 mai 2021

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"), CType(Nothing, DateTime?))

ou
                .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.
Messages postés
15931
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 mai 2021
545 >
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018

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.
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26 >
Messages postés
15931
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 mai 2021

y a du mieux avec
        .DateFinProjet = If(Not String.IsNullOrEmpty(row.Field(Of DateTime?)("Date_de_Fin_Projet").ToString()), _
row.Field(Of Date)("Date_de_Fin_Projet"), Nothing), _

J'ai mis (Of DateTime?). Par contre, dans le dgv, cela m'affiche 00:00:00 23:33 pour le champ vide dans la table
Messages postés
15931
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 mai 2021
545 >
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018

Et bien essaye que DateFinProjet soit une date normale avec
.DateFinProjet = If(Not String.IsNullOrEmpty(row.Field(Of DateTime?)("Date_de_Fin_Projet").ToString()), _
                                            row.Field(Of Date)("Date_de_Fin_Projet"), DateTime.Now)

Ça devrait te mettre l'heure ou tu exécutes le code.
A toi de choisir une date par défaut qui te convient
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26 >
Messages postés
15931
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 mai 2021

Merci Whismeril de ta patience, de tes conseils et du temps consacré à aider les moutons égarés !!!
Je mets à valider ce post.
Bonne fin de journée,
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
Avec Public Property DateFinProjet As DateTime
et
                .DateFinProjet = If(Not String.IsNullOrEmpty(row.Field("Date_de_Fin_Projet").ToString()), _
                                    row.Field(Of Date)("Date_de_Fin_Projet"), New DateTime())

J'avais bien vu que tu avais omis le (Of Date) !!!

J'ai directement l'erreur


jean-marc
Messages postés
15931
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 mai 2021
545
ok, comme je te l'ai dit accès connais pas...