IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

DateTime et base Access


Sujet :

Windows Forms

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 73
    Points : 29
    Points
    29
    Par défaut DateTime et base Access
    Bonjour à tous,

    Je suis confronter à un léger problème. Je fais une application C# et mes données sont stockées dans Access. Jusque la pas de problème pour accéder et rentrer de nouvelles données.

    Mais maintenant je souhaite utiliser des dates et la ça devient très problématique.

    J'extrait une DataTable de ma base et j'instancie un objet Contrat avec.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    public Contrat(DataTable contratCharge)
            {
                  this.coCateg = contratCharge.Rows[0]["coCateg"].ToString(); 
                  this.coCoeff = contratCharge.Rows[0]["coCoeff"].ToString(); 
                  this.cocommentaire = contratCharge.Rows[0]["cocommentaire"].ToString();   
                  //this.codateDebut.Add(contratCharge.Rows[0]["codateDebut"]);
                  this.codatedebut = ((DateTime)contratCharge.Rows[0]["codateDebut"]).Date;
                  this.codateFin = ((DateTime)contratCharge.Rows[0]["codateFin"]);     
                  this.codateFinPrevue = ((DateTime)contratCharge.Rows[0]["codateFinPrevue"]); 
                  this.coDateFinProlong = ((DateTime)contratCharge.Rows[0]["coDateFinProlong"]); 
                  this.coDateSignature = ((DateTime)contratCharge.Rows[0]["coDateSignature"]); 
                  this.CoDI = contratCharge.Rows[0]["CoDI"].ToString(); 
                  this.coEchelon = contratCharge.Rows[0]["coEchelon"].ToString(); 
                  this.coInsertC2 = ((bool)contratCharge.Rows[0]["coInsertC2"]); 
                  this.comotif = contratCharge.Rows[0]["comotif"].ToString(); 
                  this.comotifcourt = contratCharge.Rows[0]["comotifcourt"].ToString(); 
                  this.coNiv = contratCharge.Rows[0]["coNiv"].ToString(); 
                  this.coNumContrat = contratCharge.Rows[0]["coNumContrat"].ToString(); 
                  this.coOA = contratCharge.Rows[0]["coOA"].ToString(); 
                  this.coregistreEntree = ((bool)contratCharge.Rows[0]["coregistreEntree"]); 
                  this.coregistreSortie = ((bool)contratCharge.Rows[0]["coregistreSortie"]); 
                  this.coSalaire = ((Double)contratCharge.Rows[0]["coSalaire"]);
                  this.cosoldeRtt = ((bool)contratCharge.Rows[0]["cosoldeRtt"]); 
                  this.cosouplesseMaxi = ((int)contratCharge.Rows[0]["cosouplesseMaxi"]);
                  this.cosouplesseMini = ((int)contratCharge.Rows[0]["cosouplesseMini"]);
                  this.coStatReception = ((bool)contratCharge.Rows[0]["coStatReception"]); 
                  this.costatutContrat = contratCharge.Rows[0]["costatutContrat"].ToString(); 
                  this.inAlps = contratCharge.Rows[0]["inAlps"].ToString(); 
                  this.secode = contratCharge.Rows[0]["secode"].ToString(); 
                  this.socoFourBaan = contratCharge.Rows[0]["socoFourBaan"].ToString(); 
                  this.meid = contratCharge.Rows[0]["meid"].ToString(); 
            }
    Pour les String, les booleens et les numérique pas de problème (enfin pas d'erreur mais je n'ai pas encore vu ce que ça donnait par la suite).

    Par contre je n'arrive pas du tout à insérer les champs date dans ma classe...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    public class Contrat
        {
            public String coCateg { get; set; }
            public String CoDI { get; set; }
            public String coNumContrat { get; set; }
            public String meid { get; set; }
            public String socoFourBaan { get; set; }
            public String inAlps { get; set; }
            public String secode { get; set; }
            public String coNiv { get; set; }
            public String coEchelon { get; set; }
            public String coCoeff { get; set; }
            public String costatutContrat { get; set; }
            public bool coregistreEntree { get; set; }
            public bool coregistreSortie { get; set; }
            public DateTime codateDebut { get; set; }
            public DateTime codateFin { get; set; }
            public int cosouplesseMini { get; set; }
            public int cosouplesseMaxi { get; set; }
            public DateTime codateFinPrevue { get; set; }
            public DateTime coDateFinProlong { get; set; }
            public String cocommentaire { get; set; }
            public bool cosoldeRtt { get; set; }
            public String comotifcourt { get; set; }
            public String comotif { get; set; }
            public bool coStatReception { get; set; }
            public DateTime coDateSignature { get; set; }
            public Double coSalaire { get; set; }
            public String coOA { get; set; }
            public bool coInsertC2 { get; set; }
            public Metier cometier;
    Quelqu'un saurait il comment je dois faire ?

  2. #2
    Membre éclairé Avatar de nsanabi
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    570
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2003
    Messages : 570
    Points : 678
    Points
    678
    Par défaut
    quelle est l'exception levée quand tu exécute ton code?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 73
    Points : 29
    Points
    29
    Par défaut
    Bonjour,

    Voici l'exception soulevée :

    L'exception System.InvalidCastException n'a pas été gérée
    Message="Le cast spécifié n'est pas valide."
    Sur la première ligne ou j'essaie de rentrer un dateTime, donc j'aurai le cas pour tous...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     this.codateDebut = ((DateTime)contratCharge.Rows[0]["codateDebut"]);
    Déclaration de codateDebut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     public DateTime codateDebut { get; set; }

  4. #4
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Hello,

    exécute ton code debug, en pas à pas, et mets un espion sur contratCharge.Rows[0]["codateDebut"]. Tu sauras alors son type (qui visiblement n'est pas dateTime )
    ಠ_ಠ

  5. #5
    Membre éclairé Avatar de nsanabi
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    570
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2003
    Messages : 570
    Points : 678
    Points
    678
    Par défaut
    qui visiblement n'est pas dateTime
    si c le cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Convert.ToDateTime(contratCharge.Rows[0]["codateDebut"]);

  6. #6
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 73
    Points : 29
    Points
    29
    Par défaut
    Alors j'ai testé en remplissant une date mais pas l'autre dans ma base,
    codateDebut est vide et ça bloque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    -contratCharge.Rows[0]["codateDebut"]	{}	object {System.DBNull}
    Et codaFin est rempli mais me donne ça comme date
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    +		Date	{01/01/0001 00:00:00}	System.DateTime
    Alors que c'est le 26/02/2010 normalement.

    Comment faire pour pouvoir passer une date à null (car il y en aura)
    et comment passer la bonne date quand elle est remplie ?

  7. #7
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par nsanabi Voir le message
    si c le cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Convert.ToDateTime(contratCharge.Rows[0]["codateDebut"]);
    C'est plus compliqué que ça. On sait pas comment access stocke les dates, on sait pas comment le provider ADO.Net les restitue, on sait pas, si jamais ce sont des chaînes, comment c'est formaté (dd/mm/yyyy ? mm/dd/yyyy ? yyyy/mm/dd ?)

    Attendons d'abord de voir quels sont le type et la valeur de ce mystérieux contratCharge.Rows[0]["codateDebut"]
    ಠ_ಠ

  8. #8
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 73
    Points : 29
    Points
    29
    Par défaut
    si c le cas:
    Code :

    Convert.ToDateTime(contratCharge.Rows[0]["codateDebut"]);
    Je viens d'essayer, quand la date est remplie ça marche !

    Par contre .... Quand la date est vide ça ne marche toujours pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    +		Convert.ToDateTime(contratCharge.Rows[0]["codateDebut"])	'Convert.ToDateTime(contratCharge.Rows[0]["codateDebut"])' a levé une exception de type 'System.InvalidCastException'	System.DateTime {System.InvalidCastException}

  9. #9
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    DataRow a une méthode IsNull, qui t'indique si tel ou tel champ est null.

    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (!contratCharge.Rows[0].IsNull("codateDebut"))
        this.codateDebut = (DateTime)contratCharge.Rows[0].IsNull("codateDebut");
    Reste à voir combien tu veux que codateDebut vaille quand ton fichier access contient null dans une colonne de date.
    ಠ_ಠ

  10. #10
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 73
    Points : 29
    Points
    29
    Par défaut
    Je vais essayer en mettant une valeur bidon, après mes dates je vais les afficher dans un textbox et faire des "calculs" dessus.
    Il faudra que je test à chaque fois... C'est chiant de pouvoir mettre à null un DateTime...


    Edit :

    Voilà comment j'ai fait dans mon code si ça peut servir à quelqu'un d'autre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DateTime dateBidon = new DateTime(0001, 01, 01);
                  this.codateDebut = dateBidon;
                  this.codateFin = dateBidon;
                  this.codateFinPrevue = dateBidon;
                  this.coDateFinProlong = dateBidon;
                  this.coDateSignature = dateBidon;
     
                               if (!contratCharge.Rows[0].IsNull("codateDebut"))
                  { this.codateDebut = Convert.ToDateTime(contratCharge.Rows[0]["codateDebut"]); }
    Merci pour votre aide, je vais pouvoir avancer sur mon projet

  11. #11
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 73
    Points : 29
    Points
    29
    Par défaut Update problème jour et moi qui s'inserve
    Bonjour,

    Je pensais mon problème résolu concernant les dates mais en fait je rencontre un nouveau soucis !

    Quand j'ai un jour et un mois < à 12 il s'inverse à chaque fois que je fais l'update dans la base...

    Alors à part lancer deux fois la requête pour retomber sur la bonne date, y'a t'il moyen de gérer cela proprement ?

  12. #12
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par yoann7 Voir le message
    Quand j'ai un jour et un mois < à 12 il s'inverse à chaque fois que je fais l'update dans la base...
    Comment fais tu ton update ?
    ಠ_ಠ

  13. #13
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 73
    Points : 29
    Points
    29
    Par défaut
    Alors j'ai une classe Requete_SQL avec une méthode qui a ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     OleDbConnection connec = new OleDbConnection(this.ParametresConnection);
                string requete = "UPDATE " + Table + " SET " + ChampsAmodifier + " WHERE " + condition;
     
                try
                {
                    OleDbCommand command = new OleDbCommand(requete, connec);
                    connec.Open();
                    Etat = (command.ExecuteNonQuery() > 0);
                    //Etat = true;
                    connec.Close();
    Et je lui passe ça (méthode updateContrat() qui se trouve dans la classe contrat, les champs date sont des dateTime :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    req="coCateg='"+ this.coCateg +"',CoDI='" +this.CoDI + "',socoFourBaan='" + this.socoFourBaan + "',";
                req+= " secode='" + this.secode + "',coNiv='" + this.coNiv + "',coEchelon=" + this.coEchelon + ", coCoeff=" + this.coCoeff + ",";
                req+= " costatutContrat='" + this.costatutContrat + "',coregistreEntree=" + this.coregistreEntree + ",coregistreSortie =" + this.coregistreSortie +",";
                req+= " codateDebut=#" + this.codateDebut + "#,codateFin=#" + this.codateFin + "#,cosouplesseMini=" + this.cosouplesseMini + ",";
                req+= " cosouplesseMaxi=" + this.cosouplesseMaxi + ",codateFinPrevue=#" + this.codateFinPrevue + "#,coDateFinProlong =#" + this.coDateFinProlong +"#,";
                req+= " cocommentaire='" + this.cocommentaire + "',cosoldeRtt=" + this.cosoldeRtt + ",comotifcourt='" + this.comotifcourt + "',";
                req+= " comotif='" + this.comotif + "',coStatReception=" + this.coStatReception + ",coDateSignature=#" + this.coDateSignature + "#,";
                req+= " coSalaire=" + this.coSalaire + ",coOA='" + this.coOA + "',coInsertC2=" + this.coInsertC2 + ",";
                req+= " meid='" + this.cometier.getId() + "'";
    return sql.Modifier_Un_Enreg("TCONTRAT", req, cond);
    Et en fait si, par exemple je met une date au 01/03/2010 en cliquant une fois j'aurai la bonne date de rentrer, si je clic de nouveau sur mon bouton qui appelle la mise à jour la date devient 03/01/2010, si je reclic ça ré-inverse et ainsi de suite...

    C'est vraiment embattant les dates, je débute en C# et autant pour le reste du code j'ai pas eu de gros problèmes mais les dates je galère vraiment la.

  14. #14
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Points : 106
    Points
    106
    Par défaut
    essai ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    /// <summary>
    /// Lit une colonne d'un DataRow contenant une date à partir 
    /// du nom de la colonne tout en vérifiant si la valeur de la colonne 
    /// n'est pas null
    /// </summary>
    /// <param name="dr">Datarow concerné</param>
    /// <param name="strColumnName">nom de la colonne à lire</param>
    /// <param name="dtDefault">valeur par défaut si le champ n'est pas renseigné</param>
    /// <returns></returns>
    public static DateTime GetDateTime(DataRow dr, string strColumnName, 
        object dtDefault)
    {
    	if (dr.IsNull(strColumnName))
    	{
    		if (dtDefault == null)
    			return s_dtZero;
    		else
    			return (DateTime)dtDefault;
    	}
    	else
    		return DateTime.Parse(dr[strColumnName].ToString()); 	
    }
    où s_dtZero est la date "0" définie par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public static DateTime s_dtZero = new DateTime(1899, 12, 30);
    pour l'insertion et la maj dans la base de données tu dois distinguer le cas où le champ peut être null ou pas

    1- le champ peut être null
    - pour l'insertion si la valeur = s_dtZero tu n'ajoutes pas la colonne dans la liste des colonnes à mettre à jour. Par contre si la valeur != s_dtZero tu ajoutes la colonne dans la liste des colonnes à mettre à jour et tu converti valeur en string :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    strUpdateSQL += ", '" + valeur.ToString("dd/MM/yyyy") + "'"
    Ps: la partie des mois est bien en majuscule

    - pour la maj utilise le fragment de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (valeur != s_dtZero )
       strUpdateSQL += ", DateValeur = '" + valeur.ToString("dd/MM/yyyy") + "'";
    else
       strUpdateSQL += ", DateValeur = " + TranslateZeroDate(provider);
    où TranslateZeroDate est le fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public static string TranslateZeroDate(EAdoProvider ap)
    {
        if (ap == EAdoProvider.Oracle || ap == EAdoProvider.PostGreSQL)
              return "NULL";
        else
              return "'00:00:00'";
    }

    2- le champ ne peut être null tu converti simplement la valeur en string et tu l'insères ou la mets à jour dans la BD.

  15. #15
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 73
    Points : 29
    Points
    29
    Par défaut
    Merci beaucoup pour ton aide!

    J'ai utilisé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    codateDebut='" + this.codateDebut.ToString("dd/MM/yyyy") + "'
    Et ma date rentre bien!

    Je vais suivre ta logique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (valeur != s_dtZero )
       strUpdateSQL += ", DateValeur = '" + valeur.ToString("dd/MM/yyyy") + "'";
    else
       strUpdateSQL += ", DateValeur = " + TranslateZeroDate(provider);
    En testant par rapport à ma "dateBidon" au "01/01/0001".

    Merci de m'avoir accordé du temps, je commençais à désespérer avec les dates !

  16. #16
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Hello,

    plutôt que se fatiguer à générer sous forme de chaîne la requête d'insertion, utilise une requête paramétrée. cf cette inévitable tutoriel : http://johannblais.developpez.com/tu...s-donnees/#LIV
    Comme ça, outre que tu sécurises ton code en évitant l'injection SQL, tu ne te prends plus la tête avec le formatage des données.
    ಠ_ಠ

  17. #17
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 73
    Points : 29
    Points
    29
    Par défaut
    Merci beaucoup pour le lien, je vais essayer d'appliquer cette méthode à mon programme, va falloir que je change pas mal de truc mais c'est vrai que c'est beaucoup plus sécurisant.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.NET] Base Access et valeur de datetime picker
    Par -Fly- dans le forum Débuter
    Réponses: 8
    Dernier message: 14/06/2012, 12h05
  2. migration de base access vers postgres
    Par greg_ggl dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 09/03/2006, 10h33
  3. Crash Base Access
    Par Ronald G. dans le forum Access
    Réponses: 4
    Dernier message: 04/08/2003, 11h55
  4. Export base Access vers MySql
    Par jjn1er dans le forum Outils
    Réponses: 7
    Dernier message: 10/03/2003, 23h50
  5. [VB6] [ADO] Like sur base Access
    Par dlpxlid dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 24/01/2003, 11h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo