none
Parser DateTime System.Date.SQLite RRS feed

  • Question

  • Bonjour,
    J'ai une erreur extrêmement bizarre...
    J'ai deux Classes Quasi-identiques qui accèdent à deux bases de données SQLite.
    Une contenant des Comptes, l'autre des Mouvements.

    J'enregistre des dates au format DATETIME dans mes deux bases SQLite.

    Ma première classe, contient cette méthode pour charger les données.

    private void LoadData()
            {
                SetConnection();
                sql_con.Open();
                sql_cmd = sql_con.CreateCommand();
                string CommandText = "select ID,Name,Solde,Last_Update from Comptes";
                sql_cmd.CommandText = CommandText;
                SQLiteDataReader reader = sql_cmd.ExecuteReader();
                while (reader.Read())
                {
                    Compte compte = new Compte();
                    compte.ID = reader.GetInt16(reader.GetOrdinal("ID"));
                    compte.Nom = reader.GetString(reader.GetOrdinal("Name"));
                    compte.Solde = reader.GetDouble(reader.GetOrdinal("Solde"));
                    string to = reader.GetString(reader.GetOrdinal("Last_Update"));
                    DateTime dt=DateTime.ParseExact(reader.GetString(reader.GetOrdinal("Last_Update")),"yyyy-MM-dd hh:mm:ss",CultureInfo.InvariantCulture);
                    compte.Last_Update = dt;
                    this.Comptes.Add(compte);
                
                }
                sql_con.Close();
            }



    La seconde celle ci:

            private void LoadData()
            {
                SetConnection();
                sql_con.Open();
                sql_cmd = sql_con.CreateCommand();
                string CommandText = "SELECT ID,Montant,ID_Emetteur,ID_Recepteur,Description,Date FROM Mouvements";
                sql_cmd.CommandText = CommandText;
                SQLiteDataReader reader = sql_cmd.ExecuteReader();
                while (reader.Read())
                {
                    Mouvement mouvement = new Mouvement();
                    mouvement.ID = reader.GetInt16(reader.GetOrdinal("ID"));
                    mouvement.Montant=reader.GetDouble(reader.GetOrdinal("Montant"));
                    mouvement.ID_Emetteur=reader.GetInt32(reader.GetOrdinal("ID_Emetteur"));
                    mouvement.ID_Recepteur=reader.GetInt32(reader.GetOrdinal("ID_Recepteur"));
                    mouvement.Description=reader.GetString(reader.GetOrdinal("Description"));
                    String out_date = reader.GetString(reader.GetOrdinal("Date"));
                    try
                    {
                        DateTime dt = DateTime.ParseExact(out_date, "yyyy-MM-dd hh:mm:ss", CultureInfo.InvariantCulture);
                    }
                    catch (Exception ex) { }
                    this.Mouvements.Add(mouvement);
                
                }
                sql_con.Close();
            }

    La première méthode fonctionne, mais la seconde renvoie une exception disant que {"La chaîne n'a pas été reconnue en tant que DateTime valide."} au niveau du try catch...

    Je désespère depuis le début de la soirée la dessus en espérant que quelqu’un pourra m'aider ! Les deux classes étant quasi identiques.Merci !



    jeudi 6 février 2014 22:03

Réponses

  • Bonjour

    Sauf erreur de ma part, SQLite maintiens le type DateTime comme BLOB (jeu de caractères).
    Essayez de récupérer le STRING et vérifier s'il est dans le bon format. Le plus probable il n’est pas dans le format spécifié : yyyy-MM-dd hh:mm:ss.
    Je vois deux solutions : modifier l’insert pour insérer dans le bon format et exécutez un Update pour mettre dans le bon format, ou vous changez le format spécifiée au Read.

    Cordialement, 


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    • Marqué comme réponse Aurel Bera jeudi 13 février 2014 07:50
    vendredi 7 février 2014 13:15
  • Désolé j'avais seulement validé la réponse et j'ai oublié d'y répondre.

    J'ai finalement trouvé le problème avec vos pistes d'investigations :

    Ma date était au format USA, du coup, dans le premier cas pour lequel je testais, cela fonctionnait car la valeur était de 8,

    mais au format AM-PM, le deuxième cas à 14h ne fonctionnait pas (car 14 >12 qui est la valeur maximale pour le système anglosaxon...)

    La solution était donc de changer la culture avant de faire la requête.

    Merci beaucoup !

    • Marqué comme réponse Aurel Bera mercredi 16 avril 2014 13:24
    mercredi 16 avril 2014 08:35

Toutes les réponses

  • Bonjour

    Sauf erreur de ma part, SQLite maintiens le type DateTime comme BLOB (jeu de caractères).
    Essayez de récupérer le STRING et vérifier s'il est dans le bon format. Le plus probable il n’est pas dans le format spécifié : yyyy-MM-dd hh:mm:ss.
    Je vois deux solutions : modifier l’insert pour insérer dans le bon format et exécutez un Update pour mettre dans le bon format, ou vous changez le format spécifiée au Read.

    Cordialement, 


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    • Marqué comme réponse Aurel Bera jeudi 13 février 2014 07:50
    vendredi 7 février 2014 13:15
  • Bonjour

    Un petit retour SVP?

    Merci!

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    lundi 10 février 2014 10:27
  • Désolé j'avais seulement validé la réponse et j'ai oublié d'y répondre.

    J'ai finalement trouvé le problème avec vos pistes d'investigations :

    Ma date était au format USA, du coup, dans le premier cas pour lequel je testais, cela fonctionnait car la valeur était de 8,

    mais au format AM-PM, le deuxième cas à 14h ne fonctionnait pas (car 14 >12 qui est la valeur maximale pour le système anglosaxon...)

    La solution était donc de changer la culture avant de faire la requête.

    Merci beaucoup !

    • Marqué comme réponse Aurel Bera mercredi 16 avril 2014 13:24
    mercredi 16 avril 2014 08:35