Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

problème avec des nombres en SQL Server

5 réponses
Avatar
Skorpionik
Bonjour,

J'ai écrit un programme en java qui alimente automatiquement une base de
données en SQL Server, en utilisant des requêtes suivantes: INSERT INTO
Table (C1, C2) VALUES (X1,CONVERT(float,X2)) etc.
Et voilà mon problème, après le changement en float je reçois par exemple 15
au lieu de 15,99. Est-ce que quelqu'un sait comment on peut le changer?
Merci d'avance

5 réponses

Avatar
Népomucène
Bonjour,

J'ai écrit un programme en java qui alimente automatiquement une base de
données en SQL Server, en utilisant des requêtes suivantes: INSERT INTO
Table (C1, C2) VALUES (X1,CONVERT(float,X2)) etc.
Et voilà mon problème, après le changement en float je reçois par exemple 15
au lieu de 15,99. Est-ce que quelqu'un sait comment on peut le changer?
Merci d'avance




Bonjour,

Les causes sont multiples...
... et ce n'est probablement pas un problème java.

La première chose à faire est de vérifier que C2 est bien de type float
(sinon la conversion ne sert à rien)



Ta requête est :
INSERT INTO Table (C1, C2) VALUES (X1,CONVERT(float,X2))

Il faudrait m'en indiquer un peu plus car normalement cette requête
ne peut pas fonctionner sur SQL Server. Deux possibilités qui fonctionent :

INSERT INTO Table (C1, C2) SELECT X1,CONVERT(float,X2) FROM TableOrigine

ou

INSERT INTO Table (C1, C2) VALUES (@X1,CONVERT(float,@X2))

en ayant préalablement déclaré @X1 et @X2

En fait, pour bien te guider, il faut me décrire exactement d'où
viennent les données et comment tu les transmet à SQL Server.
Je te trouverai certainement une solution.

Avatar
Skorpionik
En fait mon programme alimente la base à partir de fichiers plats, d'où les
données sont extraites et envoyées directement à la base grâce aux requêtes.
Est-ce possible que mon problème est lié au fait que dans le fichier texte
est utilisé une virgule à la place du point dans les nombres?


"Népomucène" a écrit dans le
message de news: 436d31a3$0$27409$
Bonjour,

J'ai écrit un programme en java qui alimente automatiquement une base de
données en SQL Server, en utilisant des requêtes suivantes: INSERT INTO
Table (C1, C2) VALUES (X1,CONVERT(float,X2)) etc.
Et voilà mon problème, après le changement en float je reçois par exemple
15
au lieu de 15,99. Est-ce que quelqu'un sait comment on peut le changer?
Merci d'avance


Bonjour,

Les causes sont multiples...
... et ce n'est probablement pas un problème java.

La première chose à faire est de vérifier que C2 est bien de type float
(sinon la conversion ne sert à rien)



Ta requête est :
INSERT INTO Table (C1, C2) VALUES (X1,CONVERT(float,X2))

Il faudrait m'en indiquer un peu plus car normalement cette requête
ne peut pas fonctionner sur SQL Server. Deux possibilités qui fonctionent
:

INSERT INTO Table (C1, C2) SELECT X1,CONVERT(float,X2) FROM TableOrigine

ou

INSERT INTO Table (C1, C2) VALUES (@X1,CONVERT(float,@X2))

en ayant préalablement déclaré @X1 et @X2

En fait, pour bien te guider, il faut me décrire exactement d'où
viennent les données et comment tu les transmet à SQL Server.
Je te trouverai certainement une solution.



Avatar
Skorpionik
En fait mon programme alimente la base à partir de fichiers plats, d'où les
données sont extraites et envoyées directement à la base grâce aux requêtes.
Est-ce possible que mon problème est lié au fait que dans le fichier texte
est utilisé une virgule à la place du point dans les nombres?



"Népomucène" a écrit dans le
message de news: 436d31a3$0$27409$
Bonjour,

J'ai écrit un programme en java qui alimente automatiquement une base de
données en SQL Server, en utilisant des requêtes suivantes: INSERT INTO
Table (C1, C2) VALUES (X1,CONVERT(float,X2)) etc.
Et voilà mon problème, après le changement en float je reçois par exemple
15
au lieu de 15,99. Est-ce que quelqu'un sait comment on peut le changer?
Merci d'avance


Bonjour,

Les causes sont multiples...
... et ce n'est probablement pas un problème java.

La première chose à faire est de vérifier que C2 est bien de type float
(sinon la conversion ne sert à rien)



Ta requête est :
INSERT INTO Table (C1, C2) VALUES (X1,CONVERT(float,X2))

Il faudrait m'en indiquer un peu plus car normalement cette requête
ne peut pas fonctionner sur SQL Server. Deux possibilités qui fonctionent
:

INSERT INTO Table (C1, C2) SELECT X1,CONVERT(float,X2) FROM TableOrigine

ou

INSERT INTO Table (C1, C2) VALUES (@X1,CONVERT(float,@X2))

en ayant préalablement déclaré @X1 et @X2

En fait, pour bien te guider, il faut me décrire exactement d'où
viennent les données et comment tu les transmet à SQL Server.
Je te trouverai certainement une solution.



Avatar
Népomucène
Je suppose que ton application Java lit les fichiers, sélectionne
uniquement les informations intéressantes puis exécute une requête
d'insertion dans SQL Server.
Si c'est le cas, le plus efficace est de composer une chaîne de
caractères qui contient l'ordre SQL d'insertion :

Ton application a récupéré 3 valeurs X1, X2, X3 telles que :

String X1 = "Coucou";
double X2 = 53.75;
double X3 = 125.83;

Dans la base SQL Serveur, il y a une table "MaTable" avec les champs :
C1 varchar(50),
C2 Float ,
C3 Float

(Remarque : le format float n'est pas fameux, il y a un "flotement" dans
la précision. J'utilise plutôt Decimal)

Dans Java, tu fabriques alors un ordre SQL :

String SQL;
SQL = "INSERT INTO MaTable (C1,C2,C3) VALUES('" + X1 + "', " + X2 + ",
" + X3 +")";

SQL contient alors la chaîne :

INSERT INTO MaTable (C1,C2,C3) VALUES('Coucou', 53.75, 125.83)

(fais très attention aux apostrophes si tu as un champ caractère).
C'est là que tu vois que les virgules ont été transformées en points.
Sinon, SQL Server va interpréter la virgule comme séparateur de champ et
non comme séparateur décimal.

Enfin, il faut faire exécuter cet ordre avec un ordre du type
MonStatement.execute(SQL);
(je suppose que sais faire sinon je t'envoie le code)



Bon, cela dit, cette façon de faire suppose que les fichiers plats sont
petits ; car l'inconvénient est de traiter les enregistrements un par un
ce que la morale "base de données" réprouve !!!!

Si ton serveur SQL Server peut accéder directement aux fichiers plats,
il est préférable d'utiliser un lot DTS (facile à construire avec
l'assistant dans Enteprise Manager, beaucoup plus simple qu'un programme
Java et d'une rapidité foudroyante).
Ce type de lot est déclenchable automatiquement ou à la demande depuis
ton application Java.

je ne sais pas si tu es plus à l'aise en Java ou en SQL Server...

dis-moi ce que tu en penses.





En fait mon programme alimente la base à partir de fichiers plats, d'où les
données sont extraites et envoyées directement à la base grâce aux requêtes.
Est-ce possible que mon problème est lié au fait que dans le fichier texte
est utilisé une virgule à la place du point dans les nombres?



"Népomucène" a écrit dans le
message de news: 436d31a3$0$27409$


Bonjour,

J'ai écrit un programme en java qui alimente automatiquement une base de
données en SQL Server, en utilisant des requêtes suivantes: INSERT INTO
Table (C1, C2) VALUES (X1,CONVERT(float,X2)) etc.
Et voilà mon problème, après le changement en float je reçois par exemple
15
au lieu de 15,99. Est-ce que quelqu'un sait comment on peut le changer?
Merci d'avance


Bonjour,

Les causes sont multiples...
... et ce n'est probablement pas un problème java.

La première chose à faire est de vérifier que C2 est bien de type float
(sinon la conversion ne sert à rien)



Ta requête est :
INSERT INTO Table (C1, C2) VALUES (X1,CONVERT(float,X2))

Il faudrait m'en indiquer un peu plus car normalement cette requête
ne peut pas fonctionner sur SQL Server. Deux possibilités qui fonctionent
:

INSERT INTO Table (C1, C2) SELECT X1,CONVERT(float,X2) FROM TableOrigine

ou

INSERT INTO Table (C1, C2) VALUES (@X1,CONVERT(float,@X2))

en ayant préalablement déclaré @X1 et @X2

En fait, pour bien te guider, il faut me décrire exactement d'où
viennent les données et comment tu les transmet à SQL Server.
Je te trouverai certainement une solution.








Avatar
Simon OUALID
Népomucène wrote:

(fais très attention aux apostrophes si tu as un champ caractère).
C'est là que tu vois que les virgules ont été transformées en points.
Sinon, SQL Server va interpréter la virgule comme séparateur de champ et
non comme séparateur décimal.



Mieux : utiliser un PreparedStatement et les setters associés, qui ne
sera compilé qu'une fois et qui se chargera des conversions
d'apostrophes et autres caractères spéciaux...

Il prendra également en charge la gestion des virgule ou des points pour
les décimaux en fonction de la Locale de l'utilisateur.

Plus performant et plus robuste, donc.
http://java.sun.com/j2se/1.5.0/docs/api/java/sql/PreparedStatement.html

Symon