Requete

cedrickdeco Messages postés 5 Date d'inscription mercredi 25 avril 2018 Statut Membre Dernière intervention 28 avril 2018 - Modifié le 25 avril 2018 à 12:50
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 28 avril 2018 à 09:56
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;

2 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
25 avril 2018 à 13:03
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 + " = ?";
0
cedrickdeco Messages postés 5 Date d'inscription mercredi 25 avril 2018 Statut Membre Dernière intervention 28 avril 2018
25 avril 2018 à 13:07
Merci bcp ! j'essaye et je reviens a vous
0
cedrickdeco Messages postés 5 Date d'inscription mercredi 25 avril 2018 Statut Membre Dernière intervention 28 avril 2018
Modifié le 25 avril 2018 à 13:45
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();
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127 > cedrickdeco Messages postés 5 Date d'inscription mercredi 25 avril 2018 Statut Membre Dernière intervention 28 avril 2018
25 avril 2018 à 13:56
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);
        }
}
0
cedrickdeco Messages postés 5 Date d'inscription mercredi 25 avril 2018 Statut Membre Dernière intervention 28 avril 2018
Modifié le 27 avril 2018 à 16:06
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!
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
27 avril 2018 à 16:11
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
0
cedrickdeco Messages postés 5 Date d'inscription mercredi 25 avril 2018 Statut Membre Dernière intervention 28 avril 2018
28 avril 2018 à 08:04
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)
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127 > cedrickdeco Messages postés 5 Date d'inscription mercredi 25 avril 2018 Statut Membre Dernière intervention 28 avril 2018
28 avril 2018 à 09:56
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.
0
Rejoignez-nous