SQL Server/Delphi, Erreur conversion CHAR en DATETIME [Résolu]

mengele
Messages postés
30
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
12 mai 2010
- 12 juin 2008 à 11:45 - Dernière réponse : cs_cantador
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
- 13 juin 2008 à 18:50
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 :
                  MonQuery.Close;
                  MonQuery.Open;
                  MonQuery.fieldByName('LaDate').asString := '03/02/1995';
                  MonQuery.Post;
                  MonQuery.ApplyUpdates;

ç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 deux commandes pour forcer les paramètres, à savoir :
    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 :

    Update MaTable
    Set LaDate = '03/02/1995'
    Where ID=2;

...allez savoir pourquoi ?

L'erreur se reprodui 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êem 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, y a-t-il des beaux gosses de sql server qui savent où ça 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))
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
mengele
Messages postés
30
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
12 mai 2010
- 12 juin 2008 à 12:11
3
Merci
Vu que ça passe par une TQuery en mettant directement "update..., set..., where...", je pense que le pb doit se situer au niveau de l'Administrateur BDE.

Il doit certaineemnt interpréter la requête avant de l'envoyer au serveur de sql server.
Et là il doit faire des choses pas très jolies...

Faudrait pouvoir tracer ce qu'il fait...

Des pistes ?

Merci :D

Merci mengele 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de mengele
cs_cantador
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
- 12 juin 2008 à 13:52
0
Merci
Bonjour mengele,

essaie :

MonQuery.fieldByName('LaDate').asDateTime := StrToDateTime('03/02/1995');

cantador
Commenter la réponse de cs_cantador
mengele
Messages postés
30
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
12 mai 2010
- 12 juin 2008 à 18:57
0
Merci
Merci pour ta réponse,
en fait, j'ai le même problème et ce peu importe que j'update le champ datetime ou pas

ça, ça marche :
                  MonQuery.Close;
                  MonQuery.Open;
                  MonQuery.Edit;
                  MonQuery.Post;
                  MonQuery.ApplyUpdates;
ça, ça ne marche pas non plus :
                  MonQuery.Close;

                  MonQuery.Open;

                  MonQuery.Edit;
                  MonQuery.fieldByName('Champ').asInteger := 12;

                  MonQuery.Post;

                  MonQuery.ApplyUpdates;

à partir du moment où j'EDIT ou j'INSERT dans un tquery ou une ttable contenant un ou plusieurs champs DATETIME, peu importe quel champ je mets à jour (NULL autorisés), ça me détecte des DATETIME et ça part en vrille avec ce message d'erreur.

D'autres sugestions ?

Merci :D
Commenter la réponse de mengele
cs_cantador
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
- 12 juin 2008 à 20:49
0
Merci
MonQuery.ApplyUpdates;
ne sert pas à grand chose puisque tu ne commites pas derrière
tu pourrais tenter un
MonQuery.Refresh;


Mais çà sent le bug dans sqlserver.

pour l'instant je ne vois rien de plus à part tout désinstaller et réinstaller, fermer les firewall et les anti-virus..

ah si un dernier point, lorque tu fais une édition
es-tu bien calé sur le bon enregistrement ?
sinon il faut faire un locate..

Moi j'utilise Firebird et je n'ai pour l'instant aucun problème..et en plus c'est OpenSource.

tiens moi au courant

cantador
Commenter la réponse de cs_cantador
mengele
Messages postés
30
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
12 mai 2010
- 13 juin 2008 à 09:46
0
Merci
Bonjour, merci pour ta réponse.

Le loctate ne résout rien, car je suis bien positionné sur la table.

La preuve, je peux accéder aux valeurs de l'enregistrement sans problème, avec par exemple un :
showmessage(MonQuery.fieldbyname('LaDate').asString);

Ca plante sur le MonQuery.ApplyUpdates;

ça, ça passe comme une lettre à la poste :
MonQuery.Close;
MonQuery.Open;
MonQuery.Edit;
MonQuery.fieldByName('Champ').asInteger := 12;
MonQuery.Post;

Donc le problème vient au niveau de la communication avec sql server.

PS : ça marche niquel quand j'exécute mon appli depuis un autre PC connecté
à la même base sql server sur laquelle je me connecte.

ça viendrait de mon firewall vous croyez ?

En tout cas, sachez que j'avais déjà eu ce pb, alors j'ai migré ma base sql server sur un autre
PC, et là ça a marché, et puis un beau jour, ça a nouveau recrasher (sans rien toucher).

Merci
Commenter la réponse de mengele
cs_cantador
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
- 13 juin 2008 à 11:21
0
Merci
Le loctate ne résout rien..
C'était juste une piste de réfléxion.. car lorsqu'on a un phénomène de ce genre de plus non répétitif..

ça a nouveau recrasher (sans rien toucher).
C'est ce que vous croyez..

mais en fait quelque chose a bougé, c'est certain..
plein d'évènement se produire à votre insu comme :

- une intervention d'une autre personne
- une maj
- un virus
- une macro
- un téléchargement avec exécution
etc.

il faut garder l'oeil ouvert sur tout !

cantador
Commenter la réponse de cs_cantador
mengele
Messages postés
30
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
12 mai 2010
- 13 juin 2008 à 12:24
0
Merci
ça y est ça marche,
fallait potasser.

En fait, pour ceux qu'auraient ce pb aussi :

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

qu'il faut upgrader à une meilleure version :

en passant de la 5.0.1.22 à 5.2.0.2

;)

(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,
:D

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.
Commenter la réponse de mengele
mengele
Messages postés
30
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
12 mai 2010
- 13 juin 2008 à 12:53
0
Merci
correction :
nom de la DLL :
C:\Program Files\Fichiers communs\Borland Shared\BDE\sqlmss32.dll
Commenter la réponse de mengele
cs_cantador
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
- 13 juin 2008 à 13:50
0
Merci
A noter qu'on peut aussi trouver une installation de la dernière version du BDE.

En tout cas merci l'info et comme quoi avant il faut nécessairement indiquer dans sa question
la configuration de son matériel

cantador
Commenter la réponse de cs_cantador
mengele
Messages postés
30
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
12 mai 2010
- 13 juin 2008 à 16:21
0
Merci
un post encore, pour ceux qui voudraient une réponse aux questions que je posais au-dessus :

Oui, le BDE fait des choses pas jolies et reformate les transactions SQL. Et pour les tracer, utilisez "Moniteur SQL"

...de là on voit très bien que ce @!%$* m'a modifié mon Edit en le transformant en une requête SQL dans laquelle on voit d'écrit :
update ... set ... LaDate = [Une date inversée, je sais plus dans quel ordre, entre les jours, les mois et les années].

Donc forcément, sql server n'aime pas qu'on lui mette une date ayant pour jour 1995 (par exemple).

Dans le BDE, y a un champ dans Configuration/Pilotes/Natif/MSSQL/DateMode

Il faut le passer à 1 pour être en dmy. Mais ça ne sert à rien de changer ce paramètre si on a pas la dernière version de la DLL sqlmss32.dll

PS : ça marche quand même en gardant ce paramètre à 0 une fois avoir upgradé la DLL... allez savoir pourquoi :D
mais je m'pose plus de questions, l'essentiel c'est que ça marche.
Commenter la réponse de mengele
cs_cantador
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
- 13 juin 2008 à 18:50
0
Merci
bravo mengele pour cette démarche constructive !

cantador
Commenter la réponse de cs_cantador

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.