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

gtsoul 5 Messages postés samedi 31 décembre 2005Date d'inscription 15 septembre 2006 Dernière intervention - 15 sept. 2006 à 14:29 - Dernière réponse : cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention
- 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
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
gtsoul 5 Messages postés samedi 31 décembre 2005Date d'inscription 15 septembre 2006 Dernière intervention - 15 sept. 2006 à 16:25
3
Merci
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

Merci gtsoul 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 84 internautes ce mois-ci

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

Try {
    age = resultat.getInt(1);
} catch (SQLException e) {}
Commenter la réponse de cs_DARKSIDIOUS
gtsoul 5 Messages postés samedi 31 décembre 2005Date d'inscription 15 septembre 2006 Dernière intervention - 15 sept. 2006 à 15:50
0
Merci
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"
Commenter la réponse de gtsoul
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 15 sept. 2006 à 16:28
0
Merci
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.
Commenter la réponse de cs_DARKSIDIOUS

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.