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 :

No data Found


Sujet :

JDBC Java

  1. #1
    Membre averti
    Inscrit en
    Septembre 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 57
    Par défaut No data Found
    Bonjour,

    J'ai un petit soucis qui me prend la tête depuis 2 jours.
    Je réalise un batch de mise à jour d'une table de ma base.

    Avant de faire mon update, je récupère la valeur du champ que je veux mettre à jour (de type Float) pour l'incrémenter de la nouvelle valeur.

    Quand ce champs que je récupère est NULL, pas de problème il m'ajoute bien à 0 la nouvelle valeur.
    Par contre, quand il y a déjà une valeur dans le champ à mettre à jour, lorsque je veux le récupérer, il me sort un "No data found".

    Code :
    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
    public float getCompta(String numDevis) throws SQLException{
     
    		String requete = "SELECT comptaN FROM donnees_comptable WHERE num_devis LIKE '"+numDevis+"'";
    		float compta = 0f;
    		java.sql.ResultSet res = null ;
     
    		/****************/
    		System.out.println("REQUETE getCOmpta :"+requete);
    		ConnexionBase conn = new ConnexionBase();
    		res = conn.doQuery(requete);
    		/****************/	
    		try {
    			while ( res.next() )
    			{
    				if(res.getString(1) != null)
    					compta = Float.parseFloat(res.getObject(1).toString());
    			}
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		conn.close();
     
    		return compta;
     
    	}
    La méthode doQuery :
    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
    public ResultSet doQuery(String query){
     
            try {
                 Class.forName(Constantes.piloteBase);
                 String connectionString = Constantes.urlBase;
                 conn = DriverManager.getConnection(connectionString);
                 stmt = conn.createStatement();
     
                 rs = stmt.executeQuery(query);
     
            } catch (Exception e) {
                  System.out.println(e.getMessage());
                  e.printStackTrace();
            } 
           return rs;
    	}
    Merci d'avance pour vos réponses.

  2. #2
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut
    On peut voir le vrai printStackTrace() ?
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  3. #3
    Membre émérite Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Par défaut
    Bonjour

    Juste une question: comment est stocké en base ton champs ?

    pourquoi tu ne fais pas directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    compta = res.getFloat(1);

  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
    donnez le stacktrace complet de votre erreur. Aussi, le doQuery est à revoir. Il crée un statement et un connexion base de donnée qu'il ne libère java. C'est la porte ouverte aux fuites de mémoire et à la saturation du sgdb un telle méthode. Un query doit suivre le shéma

    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
    // créer connexion
    try{
      // créer statement
      try{
        // créer resultset
        try{
            // manipuler result set
        } finally {
            //libérer resultset
        }
      } finally {
        //libérer statement
      }
    } finally{
      // libérer connexion
    }
    au pire, votre conn.close(), si il fait bien tout ce nettoyage, devrait être mis dans un bloc finally.

  5. #5
    Membre averti
    Inscrit en
    Septembre 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 57
    Par défaut
    Merci pour vos réponses.

    Erreur complète :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    java.sql.SQLException: No data found
    	at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
    	at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(Unknown Source)
    	at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(Unknown Source)
    	at sun.jdbc.odbc.JdbcOdbcResultSet.getString(Unknown Source)
    	at outils.Select.getCompta(Select.java:171)
    	at lecteur.LectureFichier.lireFichierCRA(LectureFichier.java:157)
    	at lanceur.Lanceur.main(Lanceur.java:82)
    Pour le getFloat(1), j'avais essayé mais toujours la même erreur.

    Concernant la méthode doQuery, après son appel et la traitement des résultats, j'appel cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void close(){
    	if (rs != null)
                try { rs.close(); } catch (Exception e) { }
    	if (stmt != null)
                try { stmt.close(); } catch (Exception e) { }  
            if (conn != null)
                try { conn.close(); } catch (Exception e) { }
     
    	}
    Est-ce suffisant pour nettoyer correctement?

    Merci à tous

  6. #6
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    				if(res.getString(1) != null)
    					compta = Float.parseFloat(res.getObject(1).toString());
    La spec JDBC n'autorise pas à lire deux fois la même colonne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    compta = res.getFloat(1);
    if (res.wasNull())
       compta = ...;
    et si vous mettez 0 comme valeur par défaut, le test est même inutile, getFloat renvoie déjà 0.0 pour les nulls

  7. #7
    Membre émérite Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Par défaut
    je pense que tu devrais commencer par quelque chose de simple

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    String requete = "SELECT comptaN FROM donnees_comptable WHERE num_devis = '"+numDevis+"'";
    float compta = 0f;
    java.sql.ResultSet res = null ;
     
    /****************/
    System.out.println("REQUETE getCOmpta :"+requete);
     
    try {
                 Class.forName(Constantes.piloteBase);
                 String connectionString = Constantes.urlBase;
                 conn = DriverManager.getConnection(connectionString);
     
            } catch (Exception e) {
                  System.out.println(e.getMessage());
                  e.printStackTrace();
            } 
     
    try{
        stmt = conn.createStatement();
     
               try{
                 rs = stmt.executeQuery(query);
     
                 try {
                        while ( res.next() )
                        {
     
                        compta = res.getFloat(1);
     
                    } 
                finally{
                        if (rs != null){
                        try { rs.close(); } catch (Exception e) { }
                        }
                }
        finally{
            if (stmt != null) {
                try { stmt.close(); } catch (Exception e) { }  
                }
            }
        }
     
    }
    finally{
        if (conn != null){
        try { conn.close(); } catch (Exception e) { }
        }
     
    }
    après tu mettras ton chargement de drivers etc dans une méthode à part,
    mais pour l'instant commence par simple

    Sinon pour le JDBC, il a le template method qui est un design pattern adapté
    Et ça t'évites les problèmes que tu rencontres

    En gros tu fais une classe abstraite qui contient
    1 méthode avec chargement de driver
    1 méthode qui récupère une connexion à la BDD
    1 méthode qui crée le statement
    1 méthode qui ferme le statement
    1 méthode qui ferme la connexion
    1 méthode abstraite qui sera surchargée par toutes les classes filles et qui exécute la requête
    1 méthode qui appelle toutes les autres

    et de cette façon tu ne le fais qu'une fois et tu seras sûr de l'avoir fait dans la classe mère

  8. #8
    Membre averti
    Inscrit en
    Septembre 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 57
    Par défaut
    MA GNI FIQUE!

    Merci tchize_, c'était bien cela mon problème!

    Merci à tous pour le temps consacré.
    Bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme No data found avec odbc et access
    Par Ogtraba dans le forum JDBC
    Réponses: 2
    Dernier message: 07/03/2009, 15h42
  2. Move_item api et NO DATA FOUND
    Par thunderblade dans le forum Oracle
    Réponses: 0
    Dernier message: 13/01/2009, 12h16
  3. Trigger "no data found"
    Par Perceuse-Killer dans le forum PL/SQL
    Réponses: 4
    Dernier message: 17/06/2008, 15h45
  4. Erreurs NO DATA FOUND
    Par killerti dans le forum Oracle
    Réponses: 2
    Dernier message: 25/06/2007, 16h41
  5. Réponses: 3
    Dernier message: 13/07/2006, 10h40

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