2012-04-01 1 views
1

Récemment seulement changé mes déclarations dans SQL instructions préparées pour des raisons de sécurité et voici ce que je suis venu avec ..Déclaration préparée erreur

Malheureusement, il arrive avec un ne peut pas trouver l'erreur sur le

"SELECT * FROM owner WHERE username = ? AND" + "password = ?;"; 

L'erreur entière:

symbole Vous ne trouvez pas: symbole: méthode prepareStatement (java.lang.String) emplacement: dbAccess variable de type HolidayExchange.DBAccess

Je me rends compte que c'est de trouver une chaîne quand il devrait être un PreparedStatement mais comment je vois toujours dans les exemples etc.

que je fais probablement quelque chose idiot mais toute aide pour résoudre ce problème serait vraiment utile!

Le procédé entier:

DBAccess dbAccess = new DBAccess();

 String sql = "SELECT * FROM owner WHERE username = '?' AND"+ 
       " password = '?'"; 

     PreparedStatement ps = dbAccess.prepareStatement(sql); 

     ps.setString(1,u); 
     ps.setString(2,p); 

     ResultSet rs = dbAccess.executeQuery2(ps); 
     User user = new User(); 
     while (rs.next()){ 
      user.setFirstname(rs.getString("firstname")); 
      user.setSurname(rs.getString("surname")); 
      user.setUsername(rs.getString("username")); 
      user.setPassword(rs.getString("password")); 
     } 

     rs.close(); 
     dbAccess.close(); 

     if(user.getUsername().length()==0){ 
      return null; 
     }else{ 
      return user; 
     } 
    } catch (Exception e) { 
     return null; 
    } 
}` 
+0

Quel est le nom complet du package de DBAcces? Vérifiez si le javadoc montre s'il supporte même "prepareStatement". – Glenn

+0

public DBAccess() throws ServletException { this.getConnection(); } – Jimmy

+0

Qui correspond à la méthode getconnection(), qui obtient simplement la connexion à la base de données et fonctionne à 100%. – Jimmy

Répondre

2

Il y a un espace manque

 // becomes ANDpassword in the resulting string: 
    "SELECT * FROM owner WHERE username = ? AND" + "password = ?;"; 

devrait être

 // space added before passsword: 
    "SELECT * FROM owner WHERE username = ? AND" + " password = ?;"; 
+0

oups, merci pour ce fut un peu stupide. Bien que le problème principal est l'erreur de types incompatibles – Jimmy

+0

Apparemment, vous liez le nom d'utilisateur et mot de passe dans le mauvais ordre. Ne pensez pas que le point-virgule à la fin de la déclaration est nécessaire non plus. – Glenn

+0

Ok trié ça. Une idée de pourquoi je reçois cette erreur, cependant? – Jimmy

-1

Pour chaque marque question essayez de mettre des guillemets simples autour d'eux.

'?' 
+0

Vraiment? Cela ne demanderait-il pas au serveur de faire une distribution implicite après avoir déjà spécifié les types de liaison? Ne pense pas que c'est quelque chose que je ferais. Ou il me manque quelque chose ici. – Glenn

+0

Je suis d'accord avec Glen, à peu près certain que vous n'avez pas besoin de '' – Jimmy

0

Toujours enregistrer ps.toString() avant d'exécuter une requête. Cela permettra au programmeur de savoir quelle requête a réellement été exécutée.

En outre, PreparedStatement ne sont pas des chaînes

Connection con = null; Class.forName ("com.mysql.jdbc.Driver"); con = DriverManager.getConnection ("jdbc: mysql: localhost: 3306/jdbctutorial", "root", "root"); PrepareStatement ps = con.prepareStatement (sqlQuery);

+0

Ma classe DBaccess gère toutes les connexions DB. Je vais coller dans le nouveau code pour voir ce que vous en pensez. Je reçois toujours une erreur disant qu'il ne peut pas trouver le symbole, bien que – Jimmy

+0

Collé le nouveau code dans .. – Jimmy

0

Cannot find symbol: symbol: method prepareStatement(java.lang.String) location: variable dbAccess of type HolidayExchange.DBAccess

Ce message d'erreur n'a rien à ajouter à un format SQL incorrect. C'est une erreur de compilation. La classe HolidayExchange.DBAccess n'a pas de méthode nommée prepareStatement qui prend java.lang.String comme argument.

Votre SQL n'est pas validé (ou évalué) lors de la compilation, il ne peut donc pas être une raison pour les erreurs de compilation. Une fois que vous l'aurez compilé, vous constaterez probablement qu'après avoir supprimé les guillemets simples autour des points d'interrogation, votre requête fonctionnera correctement.

+0

Ok, j'ai cette méthode dans ma classe d'accès DB: 'code' public ResultSet executeQuery2 (PreparedStatement ps) throws SQLException {try { return ps.executeQuery(); } catch (SQLException e) {throw e; }} 'code' J'ai juste supposé que prepareStatement était une méthode dans le paquet PreparedStatement pour être honnête. – Jimmy

+0

Également écrit cette méthode pour essayer traiter .. public ResultSet executeQuery2 (PreparedStatement ps) throws SQLException { try { return ps.executeQuery(); } catch (SQLException e) { throw e; } } Devrais-je les appeler pour utiliser PreparedStatement? – Jimmy

+0

Vous n'avez donc pas de méthode nommée prepareStatement qui retourne PreparedStatement et prend une chaîne comme argument. De plus, PreparedStatement n'est pas un package, c'est une interface. –

0

si vous avez l'importation com.mysq.jdbc.*; enlever et changer à importation java.sql.PreparedStatement; donc vice versa, coz je pense que c'est soit la méthode PreparedStatement que vous utilisez ne convient pas à la base de données que vous connectez.

Questions connexes