Requete

Messages postés
5
Date d'inscription
mercredi 25 avril 2018
Dernière intervention
28 avril 2018
-
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;
Afficher la suite 

Votre réponse

2 réponses

Messages postés
15869
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 décembre 2018
0
Merci
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 + " = ?";
cedrickdeco
Messages postés
5
Date d'inscription
mercredi 25 avril 2018
Dernière intervention
28 avril 2018
-
Merci bcp ! j'essaye et je reviens a vous
cedrickdeco
Messages postés
5
Date d'inscription
mercredi 25 avril 2018
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();
KX
Messages postés
15869
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 décembre 2018
> cedrickdeco
Messages postés
5
Date d'inscription
mercredi 25 avril 2018
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);
        }
}
Commenter la réponse de KX
Messages postés
5
Date d'inscription
mercredi 25 avril 2018
Dernière intervention
28 avril 2018
0
Merci
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!
KX
Messages postés
15869
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 décembre 2018
-
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
cedrickdeco
Messages postés
5
Date d'inscription
mercredi 25 avril 2018
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)
KX
Messages postés
15869
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 décembre 2018
> cedrickdeco
Messages postés
5
Date d'inscription
mercredi 25 avril 2018
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.
Commenter la réponse de cedrickdeco

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.