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

cs_JMO 1830 Messages postés jeudi 23 mai 2002Date d'inscription 24 décembre 2017 Dernière intervention - 15 avril 2017 à 19:15 - Dernière réponse : cs_JMO 1830 Messages postés jeudi 23 mai 2002Date d'inscription 24 décembre 2017 Dernière intervention
- 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 

12 réponses

Répondre au sujet
Whismeril 11042 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 18 février 2018 Dernière intervention - 15 avril 2017 à 20:37
0
Utile
1
Salut

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

cs_JMO 1830 Messages postés jeudi 23 mai 2002Date d'inscription 24 décembre 2017 Dernière intervention - 15 avril 2017 à 20:41
Bonsoir Whismeril,
Merci, je vais examiner ce lien.

Bonne soirée,
Commenter la réponse de Whismeril
Whismeril 11042 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 18 février 2018 Dernière intervention - 16 avril 2017 à 00:55
0
Utile
7
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 1830 Messages postés jeudi 23 mai 2002Date d'inscription 24 décembre 2017 Dernière intervention > Whismeril 11042 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 18 février 2018 Dernière intervention - 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"), 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 11042 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 18 février 2018 Dernière intervention > cs_JMO 1830 Messages postés jeudi 23 mai 2002Date d'inscription 24 décembre 2017 Dernière intervention - 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 1830 Messages postés jeudi 23 mai 2002Date d'inscription 24 décembre 2017 Dernière intervention > Whismeril 11042 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 18 février 2018 Dernière intervention - 16 avril 2017 à 17:13
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 11042 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 18 février 2018 Dernière intervention > cs_JMO 1830 Messages postés jeudi 23 mai 2002Date d'inscription 24 décembre 2017 Dernière intervention - 16 avril 2017 à 17:36
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 1830 Messages postés jeudi 23 mai 2002Date d'inscription 24 décembre 2017 Dernière intervention > Whismeril 11042 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 18 février 2018 Dernière intervention - 16 avril 2017 à 17:39
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
cs_JMO 1830 Messages postés jeudi 23 mai 2002Date d'inscription 24 décembre 2017 Dernière intervention - 16 avril 2017 à 16:37
0
Utile
1
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 11042 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 18 février 2018 Dernière intervention - 16 avril 2017 à 17:34
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.