IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

Insertion en SQL de la valeur Float 999 999.999 ?


Sujet :

JDBC Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2003
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2003
    Messages : 921
    Par défaut Insertion en SQL de la valeur Float 999 999.999 ?
    Bonsoir à tous,

    Je suis sûr que cela vient du format Float, mais je ne peux me l'expliquer ...

    Lorsque j'insère "999 999.999" en SQL, je me retrouve avec "1 000 000" en DB ?!

    Pire, lorsque j'insère 9 999 999.999" en DB j'ai 1.0E10 ... et du coup ma requête plante !!!

    Apache Tomcat/5.5.26 - Rapport d'erreurEtat HTTP 500 -

    type Rapport d'exception
    message
    description Le serveur a rencontré une erreur interne () qui l'a empêché de satisfaire la requête.
    exception
    javax.servlet.ServletException: Après 2 tentatives, la requête suivante a échoué : INSERT INTO BDD.MATABLE (CHAMP1, CHAMP2, CHAMP3, CHAMP4, CHAMP5, CHAMP6) VALUES ('545563443', '432432423', 1.0E10, 1.0E10, '4444', '101') : [SQL0406] Erreur de conversion pendant l'affectation d'une valeur à CHAMP3. org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:286) org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913) org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462) javax.servlet.http.HttpServlet.service(HttpServlet.java:710) javax.servlet.http.HttpServlet.service(HttpServlet.java:803) [...]



    Je suis sûr que vous avez la solution ... moi je ne l'ai pas trouvé !

    Gôm

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    on peux voir ton code qui génère ta requete SQL?

  3. #3
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2003
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2003
    Messages : 921
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    on peux voir ton code qui génère ta requete SQL?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
        /**
         * @param val1
         * @param val2
         * @param val3
         * @param val4
         * @param qteSaisie
         */
        public void saisieInventaire(String val1, String val2,
                String val3, String val4, float qteSaisie) {
     
            String sql = null;
     
            sql = "INSERT INTO "
                    + schema
                    + ".INVLOT4 (codearticle, emplacement, qte, qte2, numero, depot) VALUES ('"
                    + val3 + "', '" + val4 + "', " + qteSaisie + ", "
                    + qteSaisie + ", '" + val2 + "', '" + val1 + "')";
     
            cnx.executeUpdate(sql);
            logger.debug(sql);
        }


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
        /**
         * Execute une requête Insert ou Update
         *
         * @param query
         *            La requête à executer
         */
        public void executeUpdate(String query) {
            try {
                statement.executeUpdate(query);
            } catch (SQLException e) {
                // Si il y a eu echec, c'est peut être que la base
                // a été redémarrée, il faut donc réinitialiser une connexion
                // et retenter la requête
                try {
                    logger.info("La requête suivante a échoué : " + query);
                    logger
                            .info("Tentative de reconnexion au cas où la base a été redémarrée.");
                    createConnection();
                    logger.info("Deuxième tentative de la requête ayant échouée.");
                    statement.executeUpdate(query);
                } catch (Exception e1) {
                    throw new DaoException(e1,
                            "Après 2 tentatives, la requête suivante a échoué : "
                                    + query);
                }
            }
        }

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Je vois trois problèmes.

    Le premier, tu utilise un float, hors dans la précision des float, 999999.999 et 1000000 son stocké binairement exactement de la même façon (voir code plus bas). Pour une meilleure précision, utiliser donc un double. Si t'a beson d'une précision absolue (15 chiffres devant la virgule et trois chiffres derrière par exemple) utilise un Long (qui sera des "millièmes" dans ce cas ci) ou un bigdecimal.

    Deuxièmement, tu utilise "+" pour fair ton formatage. La doc de java stipule dans Float.toString() que les nombre au dela de de 10 exposant 7 sont affiché par toString en notation scientifique. Pour palier à ce problème, tu peux utiliser la classe DecimalFormat (voir code plus bas)

    Troisièmement, préfère l'utilisation de requetes sql paramétrée, ca t'évitera ce genre d'ennui (formattage des nombres) à l'avenir bien que ca ne t'aidera pas à circonvenir la précision des floats.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public class FloatTest {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
     
    			float monFloat = 999999.999f;
    			System.out.println("float: "+new DecimalFormat("###########.################").format(monFloat));
    			System.out.println("float: "+monFloat);
    			System.out.println("1000000-999999.999 en float: "+new DecimalFormat("###########.################").format(1000000.0f-monFloat));
    			System.out.println("1000000 == 999999.999 en float? "+(1000000.0f == monFloat));
    			double monDouble = 999999.999;
    			System.out.println("double: "+new DecimalFormat("###########.################").format(monDouble));
    			System.out.println("double: "+monDouble);
    			System.out.println("1000000-999999.999 en double: "+new DecimalFormat("###########.################").format(1000000.0-monDouble));
    			System.out.println("1000000 == 999999.999 en double? "+(1000000.0 == monDouble));
    	}
     
    }
    résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    float: 1000000
    float: 1000000.0
    1000000-999999.999 en float: 0
    1000000 == 999999.999 en float? true
    double: 999999,999
    double: 999999.999
    1000000-999999.999 en double: 0,0010000000474975
    1000000 == 999999.999 en double? false

Discussions similaires

  1. INSERT SQL : problème avec valeurs à entrer
    Par St-Jean dans le forum VBA Access
    Réponses: 5
    Dernier message: 25/09/2007, 16h18
  2. SQL et GUID : Valeur de caractère non valide pour la ....
    Par jackfirst72 dans le forum Bases de données
    Réponses: 5
    Dernier message: 06/03/2007, 10h46
  3. Créer un trigger "before insert" avec SQL Server
    Par bubi dans le forum Développement
    Réponses: 2
    Dernier message: 14/11/2005, 10h12
  4. Réponses: 4
    Dernier message: 30/01/2005, 14h23
  5. Réponses: 4
    Dernier message: 13/04/2004, 19h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo