SQL Server/Delphi, Erreur conversion CHAR en DATETIME

Résolu
mengele Messages postés 29 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 12 mai 2010 - 12 juin 2008 à 11:45
mengele Messages postés 29 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 12 mai 2010 - 13 juin 2008 à 16:21
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))

9 réponses

mengele Messages postés 29 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 12 mai 2010
12 juin 2008 à 12:11
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
3
mengele Messages postés 29 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 12 mai 2010
12 juin 2008 à 18:57
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
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
12 juin 2008 à 20:49
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
0
mengele Messages postés 29 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 12 mai 2010
13 juin 2008 à 09:46
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
13 juin 2008 à 11:21
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
0
mengele Messages postés 29 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 12 mai 2010
13 juin 2008 à 12:24
ç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.
0
mengele Messages postés 29 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 12 mai 2010
13 juin 2008 à 12:53
correction :
nom de la DLL :
C:\Program Files\Fichiers communs\Borland Shared\BDE\sqlmss32.dll
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
13 juin 2008 à 13:50
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
0
mengele Messages postés 29 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 12 mai 2010
13 juin 2008 à 16:21
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.
0
Rejoignez-nous