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 :

SQL SERVER/DELPHI Erreur Conversion CHAR DATETIME


Sujet :

Bases de données Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2008
    Messages : 36
    Points : 38
    Points
    38
    Par défaut SQL SERVER/DELPHI Erreur Conversion CHAR DATETIME
    Bonjour,
    je me casse la tête depuis des jours avec ça :
    dans sql server 7 j'ai une simple table "MaTable" avec trois champs : une clé primaire "ID" (Int), un champ libre "Champ" (Int) et une date "LaDate" (DATETIME).

    contenu de "MaTable" : (ID, Champ, LaDate)

    1 10 <NULL>
    2 32 <NULL>
    3 <NULL> 01/07/2003
    4 41 <NULL>
    5 43 05/06/1991
    La table est associée à un TQuery "MonQuery" (select * from MaTable where ID=2), lui-même lié à un TUpdateSQL, tous deux bien configurés (cachedupdates=true,etc...) et lorsque je tente un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      MonQuery.Close;
      MonQuery.Open;
      MonQuery.Edit;
      MonQuery.fieldByName('LaDate').asString := '03/02/1995';
      MonQuery.Post;
      MonQuery.ApplyUpdates; //ça crashe ici
    ça me met une erreur sql server (la the fameuse erreur assez célèbre) :

    "La conversion d'un type de données CHAR en type DATETIME a donné une valeur hors des limites des valeurs de date et d'heure" (Msg. 242, Niveau 16)

    Après des heures passées sur google, le problème viendrait de la config de la BD dans SQL Server, où le format des dates ne serait pas au bon format.
    mais j'ai vérifié que je suis bien en configuration langue Française, avec le format "dmy"

    Pour le plaisir j'ai retapé les commandes pour forcer les paramètres, à savoir :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        set dateformat dmy;
            go
        set language français;
            go

    ...mais c'est toujours pareil.

    Ce qui m'étonne c'est que la requête suivante (depuis sql server directement, ou depuis un tquery, en Close, Open) s'exécute sans aucune erreur et affecte bien la valeur dans la table :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Update MaTable
        Set LaDate = '03/02/1995'
        Where ID=2;

    ...allez savoir pourquoi ?

    L'erreur se reproduit si je mets évidemment '03/21/1995' (à l'anglaise mdy).
    Donc ça veut dire que mon dmy est bien configuré.

    et même en rajoutant "set format dmy;" dans la TQuery, ça ne règle en rien le problème.

    Si quelqu'un a déjà pu contourner ou régler ce problème (qui se reproduit à l'identique avec un TTable, et/ou en modif directe des champs dans un DBGrid plutôt que le fieldbyname) ?

    PS : Je n'ai pas ce problème avec sql server 2005, pour la même BD montée depuis sql7 vers sql2005 (et donc la même table). Pourtant j'ai vérifié avoir les mêmes paramètres dans les tables de config de la BD "master".

    Là aussi, s'il y a des beaux gosses de sql server qui savent ce qui coincerait ?

    Merci beaucoup

    (PS: oui, cette table ne sert à rien, c'est juste un exemple pour illustrer mon pb, qui est général pour toute autre table contenant N champs DATETIME (N>0))

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Bonjour et bienvenue sur les forums de Développez.com

    Si votre colonne "LaDate" est bien de type DateTime alors pourquoi ne pas faire plutôt un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonQuery.fieldByName('LaDate').asDateTime := StrToDateTime('03/02/1995');
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2008
    Messages : 36
    Points : 38
    Points
    38
    Par défaut
    Bonjour, et merci pour votre réponse,
    ...ouais pourquoi pas Aka Guymelef.

    Mais ce que j'ai oublié de dire, c'est que le problème ne vient pas de la manière d'écrire ce champ en particulier, car j'ai le même problème en écrivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      MonQuery.Close;
      MonQuery.Open;
      MonQuery.Edit;
      MonQuery.fieldByName('Champ').asInteger := 12;
      MonQuery.Post;
      MonQuery.ApplyUpdates; //ça crashe ici
    Car le problème est plus compliqué que ça, car c'est qu'à la mise à jour de la table (ou à l'insertion), lors d'un applyupdates pour un tquery et un post pour un ttable, la Table se met à jour et je ne sais pas comment mais les champs datetime sont détectés, et ce même si on n'y touche pas a priori.

    Merci

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2008
    Messages : 36
    Points : 38
    Points
    38
    Par défaut
    Du coup, ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      MonQuery.Close;
      MonQuery.Open;
      MonQuery.Edit;
     { MonQuery.fieldByName('Champ').asInteger := 12;}
      MonQuery.Post;
      MonQuery.ApplyUpdates;
    ...ça marche sans erreur !

    Ce que je déuis c'est que dès que je cherche à modifier un champ de n'importe quel type, dans une table contenant un ou plusieurs champs DATETIME,...boum !

    Si quelqu'un a des pistes ?

    Merci

  5. #5
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Salut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      MonQuery.Close;
      MonQuery.Open;
      MonQuery.Edit;
      MonQuery.fieldByName('Champ').asInteger := 12;
      MonQuery.Post;
      MonQuery.ApplyUpdates;
    Regarde du coté ApplyUpdates. Est ce que tu peux faire une execution pas à pas sure ce portion de code et nous donner la ligne ou ça bloque

    A+
    On progresse .....

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2008
    Messages : 36
    Points : 38
    Points
    38
    Par défaut
    Merci pour ta réponse,

    ça bloque au niveau du ApplyUpdates.

    Avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      MonQuery.Close;
      MonQuery.Open;
      MonQuery.Edit;
      MonQuery.fieldByName('Champ').asInteger := 12;
      MonQuery.Post;
    mon appli ne plante pas, et y a aucun message d'erreur.

    Mais tu me diras, ça sert à rien de poster si je mets pas à jour dans la table réelle.

    Par contre évidemment, si je fais la même chose en passant par un TTable, ça plante au niveau du Post :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ...
    //MaTTable.Open;
    MaTTable.Edit;
    MaTTable.FieldByName('Champ').asInteger := 12;
    MaTTable.Post;
    //MaTTable.Close;
    ...

  7. #7
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Et si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MonQuery.Close;
    MonQuery.Open;
    Est ce que l'enregistrement fraichement saisi/modifié est visible.

    A+
    On progresse .....

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2008
    Messages : 36
    Points : 38
    Points
    38
    Par défaut
    ça y est ça marche,
    fallait potasser... vindiou !

    En fait, pour ceux qu'auraient aussi ce pb (c'est le but d'un post résolu) :

    ça vient de C:\Program Files\Fichiers communs\Borland Shared\BDE\sqlmss32.dll

    qu'il faut upgrader à une meilleure version :

    Moi je suis passé de la 5.0.1.22 à 5.2.0.2 par exemple. Mais y a sans doute plus récent.



    (en fait, c'est pk j'avais un BDE installé issu de delphi 4)
    donc vous tous avec vos delphi 6 et 7, forcément, vous n'avez jamais ce blem

    merci,


    PS : ce pb n'est présent que sur win2000, winXP

    sur win inférieur, le bde n'est pas natif et la dll est propre à windows : sqlsrv32.dll.

    Et elle pilote correctement.

    salut à tous.

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

Discussions similaires

  1. [VB.NET][SQL Server 2000] Erreur de connexion
    Par TheBlue dans le forum Accès aux données
    Réponses: 9
    Dernier message: 09/07/2007, 10h04
  2. [SQL SERVER][ADO] Erreur inconue
    Par aityahia dans le forum Bases de données
    Réponses: 2
    Dernier message: 05/03/2007, 18h10
  3. Réponses: 4
    Dernier message: 14/02/2007, 17h53
  4. [SQL Server 2000] erreur lors importation fichier excel
    Par Abydos Business Group dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 07/03/2006, 09h24
  5. SQL Server: Java Erreur Socket
    Par BenoitM dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 28/04/2003, 16h32

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