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

Bases de données Delphi Discussion :

MSSQL / ADO / DATE


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Profil pro
    Delphi 10.4
    Inscrit en
    Août 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Delphi 10.4

    Informations forums :
    Inscription : Août 2007
    Messages : 51
    Points : 41
    Points
    41
    Par défaut MSSQL / ADO / DATE
    Bonjour,

    Sous Delphi Xe, MsSql Express 2012, en utilisant un ADOConnection et un ADoQuery très simple (SELECT * FROM MYTABLE WHERE ID=1) cela me retourne un DataSet contenant 1 record (normal).

    Lorsque j'essaie d'accéder à une information définie comme type DATE (au niveau de MSSql) je me rends compte que le champ (TField) est de type TStringField et non TDateTimeField et que donc ;

    DataSet.FieldByName( 'DATE' ).Value me retoune une chaine de caractères (contenant bien la date YYYY-MM-DD) et pas une valeur de type TDateTime.

    Mon application est actuellement fonctionnelle avec MySql, FireBird et Access via ADO (avec ces 3 autres SGBD cela retoune bien une date) et j'essaie d'être le plus "générique" possible dans la gestion des requêtes SQL et gestion des données c'est pourquoi je ne peux pas faire une conversion String > Date "manuelle" sinon je crée un cas particulier dans les modules de haut niveau qui ne savent pas quel SGBD est utilisé.

    PS : dans les commande sINSERT et dans SQL Management Studio les dates sont au format 'YYYY-MM-DD' alors que j'ai un windows FR et SQL Express 2012 FR.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 74
    Points : 76
    Points
    76
    Par défaut
    Bonjour,

    En remplaçant

    DataSet.FieldByName( 'DATE' ).Value

    par

    DataSet.FieldByName( 'DATE' ).AsDateTime tu devrais obtenir ce qui tu veux

  3. #3
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par istam3 Voir le message
    Bonjour,

    En remplaçant

    DataSet.FieldByName( 'DATE' ).Value

    par

    DataSet.FieldByName( 'DATE' ).AsDateTime tu devrais obtenir ce qui tu veux
    Sauf que (si mes souvenirs sont bon) les composants Ado n'ont pas de déclinaisons AsXXXX (AsDateTime, AsInteger, etc ...)
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 74
    Points : 76
    Points
    76
    Par défaut
    Sous Delphi 7 et 2009 le TAdoQuery propose bien tout les typages AsString, AsInterger, etc.....
    et après vérification dans XE2 aussi, je suppose donc que ça devrait y être dans XE

  5. #5
    Membre du Club
    Profil pro
    Delphi 10.4
    Inscrit en
    Août 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Delphi 10.4

    Informations forums :
    Inscription : Août 2007
    Messages : 51
    Points : 41
    Points
    41
    Par défaut
    Oui effectivement AsDateTime existe bien, mais déclenche une exception de convertion.
    Ce que je ne comprend pas c'est le fait que le Type de champ n'est pas le même entre Firebird/MySql/access et MS Sql alors que les champs sous-jacent dans les tables sont de type Date.

    Avec Firebird, MySql et Access :

    (DataSet.FieldByName(DB_FLDS_PATIENTS_BIRTHDATE) is TDateTimeField) = True

    Avec MsSql :

    DataSet.FieldByName(DB_FLDS_PATIENTS_BIRTHDATE) is TDateTimeField = False

    et cela en utilisant les même instructions SQL (select * ...) et composants ADOConncection et ADOQuery. Seule la chaine de connexion change .

    Je vais créer une application simple basée uniquement sur des composants visuels ADOConnection > ADOTable > DataSource > DBGrid afin de voir si la colonne "Date" devient également un String !

  6. #6
    Membre du Club
    Profil pro
    Delphi 10.4
    Inscrit en
    Août 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Delphi 10.4

    Informations forums :
    Inscription : Août 2007
    Messages : 51
    Points : 41
    Points
    41
    Par défaut
    Voila je viens de créer une application test avec

    ADOConnection (Provider=SQLOLEDB.1)
    !
    !
    ADOTable
    !
    !
    DataSource
    !
    !
    DBGrid

    ADOTable "pointe" sur une table contenant un champ de type "DATE"

    et bien le champ correspondant (après avoir utilisé l'éditeur de champs de la table pour importer les champs) est de type TWideStringField

    Why ?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 74
    Points : 76
    Points
    76
    Par défaut
    Citation Envoyé par steph1969 Voir le message
    Ce que je ne comprend pas c'est le fait que le Type de champ n'est pas le même entre Firebird/MySql/access et MS Sql alors que les champs sous-jacent dans les tables sont de type Date.
    C'est parce que me semble-t-il, les différentes sgbd ne stockent pas les champs de la même façon, ce n'est pas parce que le champ est dit de type "date" ou "datetime" sous les 4 qu'il est stocké et remonté de la même façon.
    Après n'étant pas utilisateur de MySql et MS Sql je ne suis pas sûr de pouvoir t'aider beacoup plus..

  8. #8
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par istam3 Voir le message
    Sous Delphi 7 et 2009 le TAdoQuery propose bien tout les typages AsString, AsInterger, etc.....
    et après vérification dans XE2 aussi, je suppose donc que ça devrait y être dans XE
    oupss , j'étais sur les ParamByName et pas sur les FieldByName, le vendredi c'est dur dur
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  9. #9
    Membre du Club
    Profil pro
    Delphi 10.4
    Inscrit en
    Août 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Delphi 10.4

    Informations forums :
    Inscription : Août 2007
    Messages : 51
    Points : 41
    Points
    41
    Par défaut
    En cherchant avec le mot clé TWideStringField je suis tombé sur ceci :

    http://qc.embarcadero.com/wc/qcmain.aspx?d=75076

    c'est exactement cela ! ...

    Je vais basculer mes champs Date et Time en DateTime ... mais bon c'est incroyable ce genre de bug ... surtout si cela traine depuis D2009 ! .

    m'enfin, j'aurais perdu la journée ..

    Merci à vous

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 74
    Points : 76
    Points
    76
    Par défaut
    Citation Envoyé par steph1969 Voir le message
    Avec Firebird, MySql et Access :

    (DataSet.FieldByName(DB_FLDS_PATIENTS_BIRTHDATE) is TDateTimeField) = True

    Avec MsSql :

    DataSet.FieldByName(DB_FLDS_PATIENTS_BIRTHDATE) is TDateTimeField = False
    Truc bête, as-tu essayé avecau lieu de TDateTimeField.

    le vendredi c'est dur dur
    je confirme le vendredi c'est plus dur

  11. #11
    Membre du Club
    Profil pro
    Delphi 10.4
    Inscrit en
    Août 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Delphi 10.4

    Informations forums :
    Inscription : Août 2007
    Messages : 51
    Points : 41
    Points
    41
    Par défaut
    le type est bien TWideStringField . (ce qui n'a rien avoir avec un type Date !).

  12. #12
    Membre du Club
    Profil pro
    Delphi 10.4
    Inscrit en
    Août 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Delphi 10.4

    Informations forums :
    Inscription : Août 2007
    Messages : 51
    Points : 41
    Points
    41
    Par défaut
    Bon j'ai changé les champ DATE et TIME en DATETIME et cela fonctionne ...

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

Discussions similaires

  1. Transaction MsSQL ADO
    Par olibara dans le forum C#
    Réponses: 2
    Dernier message: 15/09/2009, 17h56
  2. [MSSQL][SQLDATE] Formatage de dates
    Par djskyz dans le forum Langage SQL
    Réponses: 6
    Dernier message: 15/09/2004, 10h36
  3. [VB6][Expert Only ?][ADO] Format universel des dates
    Par HPJ dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 14/02/2004, 10h42
  4. insérer une date dans une table mssql
    Par ericmart dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 29/01/2004, 10h37
  5. Dates et ADO
    Par rgarnier dans le forum XMLRAD
    Réponses: 2
    Dernier message: 18/05/2003, 22h00

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