Extraction base Access avec Linq d'un champ Date vide

Résolu
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 - 15 avril 2017 à 19:15
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre 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

3 réponses

Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 656
15 avril 2017 à 20:37
Salut

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

0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
15 avril 2017 à 20:41
Bonsoir Whismeril,
Merci, je vais examiner ce lien.

Bonne soirée,
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 656
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

0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
16 avril 2017 à 09:13
Bonjour Whismeril,

Merci pour tes explications.

Dans la classe, j'ai déclaré Public Property DateFinProjet() As DateTime?
et
.DateFinProjet = returnDateTime(row.Field(Of Date)("Date_de_Fin_Projet")),


    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;
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 656
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.

.DateDebutProjet = If(Not String.IsNullOrEmpty(row.Field("Date_de_demarrage_Projet").ToString()),row.Field(Of Date)("Date_de_demarrage_Projet"),New DateTime())
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27 > Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024
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.
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 656 > cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 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.
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27 > Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024
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
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
16 avril 2017 à 16:37
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
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 656
16 avril 2017 à 17:34
ok, comme je te l'ai dit accès connais pas...
0
Rejoignez-nous