[jdbc-sql]Probleme de passage de requete

Discussion dans 'Web, design' créé par Eagor, 8 Avril 2006.

Statut de la discussion:
Fermée.
  1. Offline
    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
    Eagor, 8 Avril 2006
    #1
  2. Offline
    zoheir cvm.mangaleet()
    peux tu montrer ton code pour la connexion ?
    zoheir, 8 Avril 2006
    #2
  3. Offline
    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.
    Eagor, 8 Avril 2006
    #3
  4. Offline
    zoheir cvm.mangaleet()
    Utilise la méthode executeQuery plutot que execute, elle te retournera un ResultSet unique.
    zoheir, 8 Avril 2006
    #4
  5. Offline
    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.
    Eagor, 8 Avril 2006
    #5
  6. Offline
    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?
    zoheir, 8 Avril 2006
    #6
  7. Offline
    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)
    Eagor, 8 Avril 2006
    #7
  8. Offline
    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 *).
    Bingo, 10 Avril 2006
    #8
  9. Offline
    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 :p dixit la doc sun.
    Eagor, 10 Avril 2006
    #9
  10. Offline
    Bingo Beer Addict
    Ouep, là c'est du Java, c'est plus dans mon domaine ! ;)
    Bingo, 10 Avril 2006
    #10
Statut de la discussion:
Fermée.