Requete

Signaler
Messages postés
5
Date d'inscription
mercredi 25 avril 2018
Statut
Membre
Dernière intervention
28 avril 2018
-
Messages postés
16074
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
26 octobre 2020
-
Bonjour,
j'ai dans mon code un bouton de recherche qui est sensé faire une requête select sur des tables et afficher le résultat dans un tableau. mon code ne fonctionne pas. svp j'ai besoin d'aide.voici mon code:
 String s,re;
        s=combo.getValue();
        re=txtrech.getText();
        con = dbConnection.geConnection();
        String query1="select * from "+db+".vehicules where ( '"+s+"'='"+re+"' ) ";
        
                   System.out.println("toti");
                   st = con.createStatement();
                   rs = pst.executeQuery(query1);
                   System.out.println("tata");
                   
                   while(rs.next()){ 
                       System.out.println(rs.getString("matriculeVehicule"));
              Data.add(new Vehicule(
                      rs.getString("matriculeVehicule"), 
                      rs.getString("marque"),
                      rs.getString("modele"),
                      rs.getString("categorie"),
                      rs.getString("carburant"),
                      rs.getString("transmission"),
                      rs.getString("puissance"),
                      rs.getString("poidsVide"),
                      rs.getString("nbrePlace"),
                      rs.getString("prixAchat"),
                      rs.getString("dateAchat"),
                      rs.getString("dateEnreistrement")                    
              ));
              
              tbrech.setItems(Data);
          }
          st.close();
          rs.close();

je travail en javaFX. voici les éléments de mon tableau:
@FXML
    private TableView<Vehicule> tbrech;
    @FXML
    private TableColumn<Vehicule, String> mat;
    @FXML
    private TableColumn<Vehicule, String> mark;
    @FXML
    private TableColumn<Vehicule, String> mo;
    @FXML
    private TableColumn<Vehicule, String> cat;
    @FXML
    private TableColumn<Vehicule, String> carb;
    @FXML
    private TableColumn<Vehicule, String> trans;
A voir également:

2 réponses

Messages postés
16074
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
26 octobre 2020
100
Bonjour,

String query1="select * from "+db+".vehicules where ( '"+s+"'='"+re+"' ) ";

Ta colonne en base de données
s=combo.getValue();
ne doit pas être entre guillemets.

Remarque : pour des raisons de sécurité il faudrait utiliser des PreparedStatement pour remplir la valeur re.
Voir : https://codes-sources.commentcamarche.net/faq/11131-utilisation-des-preparedstatement

String query1 = "select * from vehicules where " + s + " = ?";
Messages postés
5
Date d'inscription
mercredi 25 avril 2018
Statut
Membre
Dernière intervention
28 avril 2018

Merci bcp ! j'essaye et je reviens a vous
Messages postés
5
Date d'inscription
mercredi 25 avril 2018
Statut
Membre
Dernière intervention
28 avril 2018

j'ai corrige mais apparement la requete n'est pas bonne.voici l'erreur console:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1053)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2788)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2738)
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1617)
at gesparc.controllers.VehiculeController.btnrech(VehiculeController.java:148)

... 62 more
voici mon code corrige:
 String s,re;
        s=combo.getValue();
        re=txtrech.getText();
        con = dbConnection.geConnection();
        String query1 = "select * from vehicules where " + s + " = ?";
        
                   System.out.println("toti");
                   pst = con.prepareCall(query1);
                   rs = pst.executeQuery(query1);
                   System.out.println("tata");
                   
                   while(rs.next()){ 
                       System.out.println(rs.getString("matriculeVehicule"));
              Data.add(new Vehicule(
                      rs.getString("matriculeVehicule"), 
                      rs.getString("marque"),
                      rs.getString("modele"),
                      rs.getString("categorie"),
                      rs.getString("carburant"),
                      rs.getString("transmission"),
                      rs.getString("puissance"),
                      rs.getString("poidsVide"),
                      rs.getString("nbrePlace"),
                      rs.getString("prixAchat"),
                      rs.getString("dateAchat"),
                      rs.getString("dateEnreistrement")                    
              ));
              
              tbrech.setItems(Data);
          }
          st.close();
          rs.close();
Messages postés
16074
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
26 octobre 2020
100 >
Messages postés
5
Date d'inscription
mercredi 25 avril 2018
Statut
Membre
Dernière intervention
28 avril 2018

Tu n'as pas fait le lien entre le ? de la requête et la valeur re qui correspond.
https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

Tu devrais également considérer les try-with-resources, pour une meilleure gestion des close() et des exceptions. https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

String sqlColumn = combo.getValue();
String searchValue = txtrech.getText();
String query = "select * from vehicules where " + sqlColumn  + " = ?";
try (Connection connection = con = dbConnection.geConnection();
    PreparedStatement stmt = connection.prepareStatement(query)) {
        stmt.setString(1, searchValue);
        try (ResultSet rs = stmt.executeQuery()) {
            while (rs.next()) {
                Data.add(...);
            }
            tbrech.setItems(Data);
        }
}
Messages postés
5
Date d'inscription
mercredi 25 avril 2018
Statut
Membre
Dernière intervention
28 avril 2018

bjr les gars.SVP mon code ne passe pas encore, de grace de l'aide.voici le code:
String s,re;
        s=combo.getValue();
        re=txtrech.getText();
        con = dbConnection.geConnection();
        String query1 = "select * from vehicules where " + s +" = ? ";
        
                   System.out.println("toti");
                   
                   rs = pst.executeQuery(query1);
                   System.out.println("tata");
                   try (Connection connection = con = dbConnection.geConnection();
                    PreparedStatement pst = con.prepareStatement(query1)) {
                           pst.setString(1, re);
                    try (ResultSet rs = pst.executeQuery()) {
                   while(rs.next()){ 
                       System.out.println(rs.getString("matriculeVehicule"));
              Data.add(new Vehicule(
                      rs.getString("matriculeVehicule"), 
                      rs.getString("marque"),
                      rs.getString("modele"),
                      rs.getString("categorie"),
                      rs.getString("carburant"),
                      rs.getString("transmission"),
                      rs.getString("puissance"),
                      rs.getString("poidsVide"),
                      rs.getString("nbrePlace"),
                      rs.getString("prixAchat"),
                      rs.getString("dateAchat"),
                      rs.getString("dateEnreistrement")                    
              ));
                   }
              tbrech.setItems(Data);
          }
          pst.close();
          rs.close();
                    
                   }

voici le message d'erreur:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after statement closed.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1014)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)
at com.mysql.jdbc.StatementImpl.checkClosed(StatementImpl.java:466)
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1476)

merci d'avance!
Messages postés
16074
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
26 octobre 2020
100
Bonjour,

Les lignes 4 à 10 ne servent rien (sauf la 5), il faut utiliser uniquement les lignes 11 à 14, sinon tu vas te retrouver à ouvrir plusieurs connexions, exécuter plusieurs requêtes... bref tout en double.

Voir mon code précédent : https://codes-sources.commentcamarche.net/forum/affich-10085116#4
Messages postés
5
Date d'inscription
mercredi 25 avril 2018
Statut
Membre
Dernière intervention
28 avril 2018

Bonjour KX,
Stp excuse moi de te déranger;jusque la le code ne passe toujours pas.voici l'erreur console qui porte sur le ? du prepareStatement:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1053)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2788)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2738)
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1617)
Messages postés
16074
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
26 octobre 2020
100 >
Messages postés
5
Date d'inscription
mercredi 25 avril 2018
Statut
Membre
Dernière intervention
28 avril 2018

Avec quel code tu obtiens cette erreur ? Toujours le même ?
Celui des lignes 4 à 10, avec le
rs = pst.executeQuery(query1);
que je t'ai dit de supprimer ?
C'est normal que tu ais une erreur...

Regarde mon code, j'ai
stmt = connection.prepareStatement(query)
(pas executeQuery !)
Une fois "préparée" on remplace le ? dans la requête avec
stmt.setString(1, searchValue);
et c'est seulement à ce moment que l'on fait un
ResultSet rs = stmt.executeQuery()
...

Donc regarde la documentation sur les PreparedStatement et essayes mon code.