mengele
Messages postés29Date d'inscriptionsamedi 16 octobre 2004StatutMembreDernière intervention12 mai 2010
-
12 juin 2008 à 11:45
mengele
Messages postés29Date d'inscriptionsamedi 16 octobre 2004StatutMembreDernière intervention12 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).
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))
mengele
Messages postés29Date d'inscriptionsamedi 16 octobre 2004StatutMembreDernière intervention12 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...
à 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.
mengele
Messages postés29Date d'inscriptionsamedi 16 octobre 2004StatutMembreDernière intervention12 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
mengele
Messages postés29Date d'inscriptionsamedi 16 octobre 2004StatutMembreDernière intervention12 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.