Erreur avec SELECT, resultset et getInt() [Résolu]

Signaler
Messages postés
5
Date d'inscription
samedi 31 décembre 2005
Statut
Membre
Dernière intervention
15 septembre 2006
-
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
-
Bonjour,
j'ai un problème que tout noob java rencontre un jour, la connection avec la base de données, plus particulierement avec le formatage des données du resultset. Pour rassurer le lecteur que vous êtes, Je vais tout de suite préciser que je n'ai pas de problèmes dans l'utilisation de requête ne nécessitant de resultset pour le stockage (INSERT, DELETE, UPDATE).
Par contre je coince pour effectuer une requete de type SELECT (avec récupération de données).

J'utilise Eclipse et jdk 1.5.
Voici la classe que j'utilise pour mes connections :
/*-----------------------------------------------------------------------------------------------*/
import java.sql.*;
import javax.swing.*;

public class DbManager
{
    private Connection         conn;
    private Statement            stmt;
    private PreparedStatement     pStmt;
    private ResultSet         rs;   
    private String             pilote = "org.gjt.mm.mysql.Driver"; //"org.gjt.mm.mysql.Driver"; "com.mysql.jdbc.Driver";
    private String             url = "jdbc:mysql://localhost/";

    // Méthode de connection à la base
    // Arguments : le nom de la base, le log, le pass
    public void connect(String dbName, String log, String pass)
    {
        try
        {
            url += dbName;
            Class.forName(pilote);
            conn = DriverManager.getConnection(url,log,pass);
            stmt = conn.createStatement();
        }
        catch ( SQLException E)
        {
            JOptionPane.showMessageDialog(null,"Erreur de connexion à la base. Veuillez contacter votre administrateur système","Connexion",JOptionPane.WARNING_MESSAGE);
            System.out.println("1");
        }
        catch ( ClassNotFoundException E)
        {
            E.printStackTrace();
        }
    }

    // Méthode qui renvoit un ResultSet pour une requête
    // @args -> la requete
    public ResultSet getQuery(String query)
    {
        try
        {
            rs = stmt.executeQuery(query);
        }
        catch (SQLException E)
        {
            JOptionPane.showMessageDialog(null,"Erreur de connexion à la base. Veuillez contacter votre administrateur système","Connexion",JOptionPane.WARNING_MESSAGE);
            System.out.println("2");
            System.out.println("SQLException: " + E.getMessage());
            System.out.println("SQLState: " + E.getSQLState());
            System.out.println("VendorError: " + E.getErrorCode());
        }
        return rs;
    }
}
/*-----------------------------------------------------------------------------------------------*/

et voici mon main() :
/*------------------------------------------------------------------------------------------------*/
        DbManager conn1 = new DbManager();
        ResultSet resultat;
        Integer age;
        conn1.connect("test","root","pass"); //connection
        String sql = "SELECT `age` FROM `test`.`plop` WHERE id=1";//on prépare la requete
        resultat = conn1.getQuery(sql);
        age = resultat.getInt(1);
        System.out.println(age);
/*------------------------------------------------------------------------------------------------*/
La connection s'effectue correctement; si je remplace mon SELECT par un UPDATE, les champs sont mis à jour. Donc je pense que la liaison avec la bdd s'effectue correctement. J'ai testé ma requête avec SQLexplorer.
MAIS
dans le cas présent, Eclipse me souligne resultat.getInt(1); et me renvoie une erreur explicite:
Unhandled exception type SQLException

Je pense que l'erreur vient du main() ; pourriez-vous m'éclairer ?

Merci

6 réponses

Messages postés
5
Date d'inscription
samedi 31 décembre 2005
Statut
Membre
Dernière intervention
15 septembre 2006

Je viens de trouver.
Il faut positionner le resultset sur un élément (ou sur un autre) pour pouvoir utiliser une méthode getXXX, en utilisant par exemple la méthode first()

ainsi :
            if(resultat.first());
            {
                age = resultat.getInt(1);
                System.out.println(age);
            }

fonctionne.

merci de vos remarques
Messages postés
1155
Date d'inscription
samedi 17 janvier 2004
Statut
Membre
Dernière intervention
29 avril 2011
4
Salut,

normal que tu aies une erreur car ta requête renvoie une chaine de caractères, 'age' est compris comme le mot "age" et non la colonne.

Le problème vient des apostrophes, elles sont inutiles, essaie avec :

String sql = "SELECT age FROM test.plop WHERE id=1";//on prépare la requete

ça devrait aller mieux
Messages postés
5
Date d'inscription
samedi 31 décembre 2005
Statut
Membre
Dernière intervention
15 septembre 2006

Ce ne sont pas des apostrophes mais des accents graves, certes elles n'ont aucune utilité dans cet exemple, mais c'est une habitude que j'ai pris.
Le problème c'est que même sans il y a toujours le problème.
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
107
Il faut que tu intercepte l'exception SQLException :

Try {
    age = resultat.getInt(1);
} catch (SQLException e) {}
Messages postés
5
Date d'inscription
samedi 31 décembre 2005
Statut
Membre
Dernière intervention
15 septembre 2006

J'ai fait ceci :
/*--------------------------------*/
        try {
            age = resultat.getInt(1);
        } catch (SQLException e) {
            System.out.println("SQLException: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("VendorError: " + e.getErrorCode());
        }
/*--------------------------------*/

et cela me retourne :
"SQLException: Before start of result set
SQLState: S1000
VendorError: 0"
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
107
Oui, ce qui est normal puisque si tu ne te positionne pas sur un élément, JDBC n'a aucun moyen de savoir quel enregistrement tu veux récupèrer.

A chaque récupération de données dans une base, il faut intercepter l'exception SQLException qui se déclenche par exemple si tu essaie d'accèder à un champ qui n'existe pas.