Erreur avec SELECT, resultset et getInt()

Résolu
gtsoul Messages postés 5 Date d'inscription samedi 31 décembre 2005 Statut Membre Dernière intervention 15 septembre 2006 - 15 sept. 2006 à 14:29
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 - 15 sept. 2006 à 16:28
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
A voir également:

6 réponses

gtsoul Messages postés 5 Date d'inscription samedi 31 décembre 2005 Statut Membre Dernière intervention 15 septembre 2006
15 sept. 2006 à 16:25
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
3
kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 7
15 sept. 2006 à 15:14
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
0
gtsoul Messages postés 5 Date d'inscription samedi 31 décembre 2005 Statut Membre Dernière intervention 15 septembre 2006
15 sept. 2006 à 15:34
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.
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
15 sept. 2006 à 15:39
Il faut que tu intercepte l'exception SQLException :

Try {
    age = resultat.getInt(1);
} catch (SQLException e) {}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gtsoul Messages postés 5 Date d'inscription samedi 31 décembre 2005 Statut Membre Dernière intervention 15 septembre 2006
15 sept. 2006 à 15:50
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"
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
15 sept. 2006 à 16:28
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.
0
Rejoignez-nous