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

Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
- - Dernière réponse : cs_JMO
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 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.

Je vous remercie de vos suggestions.

jean-marc
Afficher la suite 

Votre réponse

3 réponses

Messages postés
12368
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
0
Merci
Salut

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

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

Bonne soirée,
Commenter la réponse de Whismeril
Messages postés
12368
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
0
Merci
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és
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
> Whismeril
Messages postés
12368
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
-
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.
Whismeril
Messages postés
12368
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
> cs_JMO
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
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.
cs_JMO
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
> Whismeril
Messages postés
12368
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
-
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
Whismeril
Messages postés
12368
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
> cs_JMO
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
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
cs_JMO
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
> Whismeril
Messages postés
12368
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
-
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,
Commenter la réponse de Whismeril
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
0
Merci
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
Whismeril
Messages postés
12368
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
-
ok, comme je te l'ai dit accès connais pas...
Commenter la réponse de cs_JMO

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.