Bonjour,
Nous avons des soucis avec les paramètres de requète de valeur flotante.
Le contexte :
Oracle 9i, client 9i, Appli sous delphi 2010 (edit : même problème avec XE2) avec DBExpress
La table est simplement :
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 CREATE TABLE ESSAISAND ( CHAMP1 VARCHAR2(5 BYTE), CHAMP2 FLOAT(126), CHAMP3 NUMBER(19,10), CHAMP4 NUMBER )
La requète :
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 insert into ESSAISAND (CHAMP1,CHAMP2,CHAMP3,CHAMP4) VALUES (:CHAMP1,:CHAMP2,:CHAMP3,:CHAMP4)
A l'exécution, en utilisant ParamByName :
On obtient l'erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part sqlqUERY1.ParamByName('CHAMP4' ).AsFloat := 3.33;
L'erreur est la même avec CHAMP2 et CHAMP3.---------------------------
Testconnexiondbexpress
---------------------------
ORA-00932: types de données incohérents : %s attendu ; %s obtenu.
---------------------------
OK
---------------------------
En fouillant sur le net on trouve des solutions qui fonctionent partiellement :
AsBCD
Fonctionne si la valeur est faible.
Code : Sélectionner tout - Visualiser dans une fenêtre à part sqlqUERY1.ParamByName('CHAMP3' ).AsBcd := 2.22;
Ceci ne fonctionne pas :
retourne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 D := 1230000000000000000000000000.456; sqlqUERY1.ParamByName('CHAMP3' ).AsBcd := d;
AsFmtBCD---------------------------
Testconnexiondbexpress
---------------------------
Opération en virgule flottante incorrecte.
---------------------------
OK
---------------------------
Fonction sur les petits nombre mais toujours pas sur les grands :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 D := 1230000000000000000000000000.456; sqlqUERY1.ParamByName('CHAMP3' ).AsFMTBCD := Doubletobcd(d);---------------------------
Testconnexiondbexpress
---------------------------
1,23E27 n'est pas une valeur BCD correcte.
---------------------------
OK
---------------------------
AsFloat fonctione nickel avec FireBird/DBExpress mais aussi avec Oracle/BDE !
Une solution est de se passer des paramètres :
Là, la valeur est stockée correctement (Vérifié dans Toad)... Mais ensuite elle ne s'affiche plus si on affiche la table dans un DbGrid via un ClientDataset.
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 insert into ESSAISAND (CHAMP1,CHAMP2,CHAMP3,CHAMP4) VALUES (:CHAMP1,:CHAMP2,:CHAMP3,'1.23E27')
Quelqu'un a eut une solution ?
Je ne peux pas utiliser de composants spécifiques à Oracle car nos applis sont multibases (suivant les clients) FireBird/Oracle/SQLServer.
On vient de se passer du BDE et suivi la recommandation de passer à DBexpress... Tout est basé sur DbExpress maintenant. Et nos tests ont été fait avec FireBird où il n'y a aucun souci.
Partager