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 :
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 :
1 2 3 4
| insert into ESSAISAND
(CHAMP1,CHAMP2,CHAMP3,CHAMP4)
VALUES
(:CHAMP1,:CHAMP2,:CHAMP3,:CHAMP4) |
A l'exécution, en utilisant ParamByName :
sqlqUERY1.ParamByName('CHAMP4' ).AsFloat := 3.33;
On obtient l'erreur :
---------------------------
Testconnexiondbexpress
---------------------------
ORA-00932: types de données incohérents : %s attendu ; %s obtenu.
---------------------------
OK
---------------------------
L'erreur est la même avec CHAMP2 et CHAMP3.
En fouillant sur le net on trouve des solutions qui fonctionent partiellement :
AsBCD
sqlqUERY1.ParamByName('CHAMP3' ).AsBcd := 2.22;
Fonctionne si la valeur est faible.
Ceci ne fonctionne pas :
1 2
| D := 1230000000000000000000000000.456;
sqlqUERY1.ParamByName('CHAMP3' ).AsBcd := d; |
retourne :
---------------------------
Testconnexiondbexpress
---------------------------
Opération en virgule flottante incorrecte.
---------------------------
OK
---------------------------
AsFmtBCD
Fonction sur les petits nombre mais toujours pas sur les grands :
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 :
1 2 3 4
| insert into ESSAISAND
(CHAMP1,CHAMP2,CHAMP3,CHAMP4)
VALUES
(:CHAMP1,:CHAMP2,:CHAMP3,'1.23E27') |
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.
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