[jdbc-sql]Probleme de passage de requete

Statut
N'est pas ouverte pour d'autres réponses.

Eagor

Croqueur de pomme
Voilà mon problème,
j'ai créé une base de donnée sous Access et j'aimerais implementer toute la programmation sous java.

J'ai donc chargé les drivers, créé les connections etc mais il se trouve que le driver odbc ne veut pas prendre la requete.

Pour l'exemple, je souhaite aller voir dans une table localite_CP et recuperer le cp associé à une localite via cette requete

SELECT codePostal FROM Localite_CP WHERE localite ="Mons"

sauf que Mons est la valeur du String localite.

Pour ce, je fais ceci:

Code:
public int getCodePostalDeLocalite(String localite) throws SQLException{
        String requete = "SELECT codePostal FROM Localite_CP WHERE localite =\"" + localite + "\"";
        System.out.println(requete);
        //String requete = "SELECT * FROM Localite_CP";             //avec ca ca marche
        
        boolean foundResults = statement.execute(requete);
        if(foundResults){
            ResultSet set = statement.getResultSet();
            
            do{
                set.next();
                if(localite.equals(set.getString("localite")))     return set.getInt("codePostal");   
            } while (set.isLast() != false);
        }
        return Lieu.CODE_POSTAL_DEFAUT;      //ne devrait jamais se produire
    }
Seulement je me retrouve avec ceci:
Code:
run-single:
SELECT codePostal FROM Localite_CP WHERE localite ="Mons"
java.sql.SQLException: [Microsoft][Pilote ODBC Microsoft Access] Trop peu de paramètres. 1 attendu.
        at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6958)
6460
        at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7115)
        at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(JdbcOdbc.java:3111)
        at sun.jdbc.odbc.JdbcOdbcStatement.execute(JdbcOdbcStatement.java:338)
        at elements.DB.getCodePostalDeLocalite(DB.java:60)
        at elements.Lieu.readCodePostal(Lieu.java:135)
        at elements.Lieu.getCodePostal(Lieu.java:70)
        at elements.TestAdresse.main(TestAdresse.java:24)
Et pourtant si je fais ceci, ça marche mais alors je charge toute la table

Code:
public int getCodePostalDeLocalite(String localite) throws SQLException{

        String requete = "SELECT * FROM Localite_CP";             
        
        boolean foundResults = statement.execute(requete);
        if(foundResults){
            ResultSet set = statement.getResultSet();
            
            do{
                set.next();
                if(localite.equals(set.getString("localite")))     return set.getInt("codePostal");   
            } while (set.isLast() != false);
        }
        return Lieu.CODE_POSTAL_DEFAUT;      //ne devrait jamais se produire
    }
Vous avez une idee pour resoudre ce probleme?
Serait-ce possible qu'il faille modifier les resquetes SQL pour ce driver? Ce serait quand même bien chiant...

Merci
 

zoheir

cvm.mangaleet()
peux tu montrer ton code pour la connexion ?
 
1er
OP
E

Eagor

Croqueur de pomme
voilà voilà
Code:
public class DB {
    
    Connection connection;
    Statement statement;
    
    /** Creates a new instance of DB */
    public DB() {
    }
    
    /**Charge les drivers*/
    protected void loadDriver() throws ClassNotFoundException{
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    }
    
    /**Cree la connection avec la base de donnees Funerals*/
    protected void makeConnection() throws SQLException {
        connection= DriverManager.getConnection("jdbc:odbc:Funerals");
    }
    /**Cree une instance de requete a la base de donnee*/
    protected void buildStatement() throws SQLException {
        statement = connection.createStatement();
    }
    
    /**Ferme la connection si elle est ouverte et ne fait rien si elle est fermee*/
    protected void closeConnection() throws SQLException {
        if (connection.isClosed()==false)    connection.close();
    }
    etc
Je ne pense pas que ça vienne de là parce que j'arrive a aller extraire des donnees via la deuxième façon.
 

zoheir

cvm.mangaleet()
Utilise la méthode executeQuery plutot que execute, elle te retournera un ResultSet unique.
 
1er
OP
E

Eagor

Croqueur de pomme
Ca ne marche toujours pas.

Je me demande bien ce que peut signifier le trop peu de parametres attendus et encore c'est déjà dans les exceptions.
 

zoheir

cvm.mangaleet()
bête question: quelle ligne de code provoque l'exception ?

a ta place, je ferai ceci:

Code:
if(set.next()) return set.getInt(1);
else return Lieu.CODE_POSTAL_DEFAUT;
et sinon pour les paramères, c'est simple ou double quote en access?
 
1er
OP
E

Eagor

Croqueur de pomme
Je viens de lire quelques autres tutos et il y a l'air que pour les champs dans la clause WHERE c'est ' et non "

Je teste, merci pour ton aide CVM

C'est cette ligne qui provoque l'erreur:
Code:
boolean foundResults = statement.execute(requete)
 

Bingo

Beer Addict
Oui il faut toujours préférer les ' aux ", car c'est la spécification ANSI-SQL.
En ANSI SQL, les doubles-quotes (") sont réservés pour délimiter les identificateurs (noms de tables, de colonnes, ...).
Si un joru tu changes de DB et que tu ne respectes pas ce spécifications, tu es bon pour réécrire toutes tes requêtes.
Tu vas aussi devoir faire attention à la gestion du % et du * dans les LIKE.
% c'est le standard, * est déprécié.
Je crois que depuis Access 2002, tu peux écrire tes requêtes en ANSI-92 directement (avant c'était du ANSI-89, avec les *).
 
1er
OP
E

Eagor

Croqueur de pomme
Merci du conseil Bingo, je n'avais eu qu'un petit cours d'intro et dans l exemple c'étaient des ".

Il y a l'air que je fais une autre erreur. Je devrais faire des statements precompiles pour faire ce que je veux faire ^^ dixit la doc sun.
 

Bingo

Beer Addict
Eagor a dit:
Merci du conseil Bingo, je n'avais eu qu'un petit cours d'intro et dans l exemple c'étaient des ".

Il y a l'air que je fais une autre erreur. Je devrais faire des statements precompiles pour faire ce que je veux faire ^^ dixit la doc sun.
Ouep, là c'est du Java, c'est plus dans mon domaine ! ;)
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut