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

VB.NET Discussion :

Formatter une date dans une base Sqlite


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut Formatter une date dans une base Sqlite
    bonjour,

    Le sujet est l'opération inverse de celui-ci :

    J'ai deux DTP dans un formulaire dont le rôle est de capter une date et de l'enregistrer dans une base de données SQLITE
    Ces 2 DTP sont paramétrés exactement de la même façon dans le designer.
    D'ailleurs j'ai vérifié par un débogage pas à pas que DTP.value renvoie bien la même valeur pour une date donnée (par exemple #10/26/2103 6:41:34 PM#

    Pour x raisons que je ne développerai pas ici, je n'ai pas codé de la même façon l'enregistrement de leur valeur dans la base de données :

    1er code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                    Dim dr As DataRow = Nothing
                    Dim dt As DataTable = monDataSettypé.maDataTable
     
                    dr = dt.NewRow
                    dr("DateAchat") = DTP_Achat.Value
                    dt.Rows.Add(dr)
                    monTableAdapter.Update(dt)
    Le résultat en base de données est : "26/10/2013 18:41:34"

    2ème code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SQL = "INSERT INTO table (...,DateVente) VALUES (...,@DateVente)"
    dim con as New SQLiteConnectionString(maconnexionstring)
    con.Open()
    dim cmd as New SQliteCommand(SQL, con)
    cmd.Parameters.AddWithValue("@DateVente", DTP_DateVente.Value)
    ...
    cmd.ExecuteNonQuery()
    cmd.Dispose()
    con.Close()
    Le résultat en base de données est : "2013-10-26 18:41:34"

    Pour info, c'est ce format que je souhaite avoir.

    J'ai donc la parade pour le code 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      dr("DateAchat") = DTP_Achat.Value.ToString("yyyy-MM-dd 00:00:00")
    Mais j'aimerais assez comprendre pourquoi je n'obtiens pas le même format avec le 1er le 2ème code alors que, a priori, ces 2 types de codes sont "synonymes".
    Quelqu'un a-t-il une piste d'explication ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    A mon avis ta colonne DateAchat dans la DataTable n'a pas le bon type. Je pense qu'elle est de type string (qui est le type par défaut), donc quand tu affectes une date, celle-ci est convertie en string en utilisant les paramètres de la culture courante, ce qui en français donne "26/10/2013 18:41:34". Si tu changes le type de la colonne en DateTime, ça devrait régler le problème.

  3. #3
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    DateVente et DateAchat sont de même type dans la base de données : String
    Et il ne peut en être autrement car Sqlite ne connaît pas les types DateTime.
    C'est l'un de ses inconvénients : http://fr.wikipedia.org/wiki/SQLite

    Mais comme dans un cas ça marche (DateVente) le type dans la BdD ne peut être l'explication.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par noftal Voir le message
    DateVente et DateAchat sont de même type dans la base de données : String
    Et il ne peut en être autrement car Sqlite ne connaît pas les types DateTime.
    C'est l'un de ses inconvénients : http://fr.wikipedia.org/wiki/SQLite

    Mais comme dans un cas ça marche (DateVente) le type dans la BdD ne peut être l'explication.
    Le problème n'est pas le type dans la BDD, mais le type dans le DataSet.

    SQLite n'a pas de type spécifique pour stocker les dates, ça ne veut pas dire qu'il ne sait pas du tout les gérer... tu peux quand même déclarer une colonne de type datetime (en pratique ce sera stocké comme du texte, mais SQLite conserve l'info du type que tu as déclaré, et le provider ADO.NET le voit et le gère bien comme une date).

    Si tu déclares correctement ta colonne comme DateTime dans le DataSet, je suis quasiment sûr que ça donnera le résultat attendu. Tu as essayé avant dire que ça ne peut pas être ça ?

    En gros quand tu fais Update avec ton TableAdapter, il fait une requête paramétrée, et pour le type du paramètre il utilise le type de la colonne dans le DataSet ; si c'est String, il formate la date dans un format qui n'a rien à voir avec la DB, alors que toi quand tu le fais manuellement tu mets bien DateTime, et ça marche...

  5. #5
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    Je ne comprends pas bien ta réponse.

    J'utilise un dataset fortement typé. Les datatables sont créées directement dans le schéma de base (onglet XSD sous visual Studio).
    - le type du champ date est le même dans les 2 tables de ma Bdd
    - la méthode pour construire la datatable est identique pour les 2 tables.

  6. #6
    Membre Expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Par défaut
    Ce que veux dire TomLev c'est qu'il faut t'assurer que les 2 champs correspondant à tes dates sont du même type dans ton DATASET.

    Et que pour cela il faut que tes types dans ta DB soient bien tout les deux en Datetime.
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par noftal Voir le message
    J'utilise un dataset fortement typé. Les datatables sont créées directement dans le schéma de base (onglet XSD sous visual Studio).
    - le type du champ date est le même dans les 2 tables de ma Bdd
    Le type dans le DataSet n'est pas forcément le même que dans la BDD. Le XSD que tu édites dans VS, ce n'est pas le schéma de la base, c'est celui du DataSet. Et le champ qui doit être de type DateTime, c'est dans le dataset.

    - la méthode pour construire la datatable est identique pour les 2 tables.
    Oui mais dans le cas où ça donne bien le format que tu veux, c'est toi qui fait la requête manuellement, en ajoutant un paramètre de type DateTime (AddWithValue utilise le type de la valeur pour déterminer le type du paramètre, donc ça marche bien). Donc la DataTable n'a rien à voir là-dedans, puisque dans ce cas tu ne l'utilises pas, tu tapes directement sur la BDD.

    Alors que dans l'autre cas tu utilises le TableAdapter, qui se base sur la définition des colonnes dans le DataSet pour créer les paramètres de requête. Si la colonne était bien définie comme DateTime, ça utiliserait un paramètre de type DateTime, et ça marcherait bien. Mais ce n'est pas le cas, donc, encore une fois, je pense que ta colonne est définie comme String


    Citation Envoyé par infosam76 Voir le message
    Et que pour cela il faut que tes types dans ta DB soient bien tout les deux en Datetime.
    Bah en fait ça change pas grand chose, vu que, comme dit plus haut, SQLite ne gère pas de façon spécifique le type DateTime...

Discussions similaires

  1. [MySQL] insérer une date dans une table dans un format compréhensible
    Par laurentSc dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 16/08/2014, 11h10
  2. insérer une date dans une table dans un format compréhensible
    Par laurentSc dans le forum Langage SQL
    Réponses: 5
    Dernier message: 08/08/2014, 16h31
  3. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  4. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48
  5. Inserer une date d'une table dans une autre table
    Par petitetre dans le forum Langage SQL
    Réponses: 8
    Dernier message: 18/04/2007, 20h16

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