2010-05-17 4 views
0

Je reçois une erreur lorsque j'essaie d'utiliser suivant, pourquoi est-il si?problème dans jdbc preparestatement

ResultSet findByUsername(String tablename,String field,String value) 
{ 
    pStmt = cn.prepareStatement("SELECT * FROM" + tablename +" WHERE ? = ? "); 

    pStmt.setString(1,field); 
    pStmt.setString(2,value); 
    return(pStmt.executeQuery()); 

} 

aussi j'ai essayé la suite, mais ca marche pas trop

ResultSet findByUsername(String tablename,String field,String value) 
{ 
    String sqlQueryString = " SELECT * FROM " + tablename +" WHERE " + field + "= ? ")  
    pStmt =cn.prepareStatement(sqlQuery); 
    pStmt.setString(1, value); 
    return(pStmt.executeQuery()); 

} 
+0

Peut-être assigner à pStmt et corriger les fautes de frappe dans le deuxième exemple pourrait aider :) – Anton

+0

La seconde ne compile pas. Il y a une parenthèse fermante au lieu d'un point-virgule à la fin de la chaîne SQL. Dans les prochaines questions, veuillez vous assurer que vous affichez du code ** REAL **, copypté à partir de votre environnement de travail, pour éviter les faux-fuyants inutiles. S'il vous plaît également copypasser les exceptions, car ils disent quelque chose sur la cause du problème. De plus, pour résoudre votre problème "syntaxe sql invalide", vous voudrez aussi copier la chaîne * effective * SQL ici, c'est-à-dire faire System.out.println (sqlQueryString); 'et copier son résultat ici. – BalusC

Répondre

3

Vous avez:

pStmt = cn.prepareStatement("SELECT * FROM" + tablename +" WHERE ? = ? "); 
pStmt.setString(1, tablename); 
pStmt.setString(2,field); 
pStmt.setString(3,value); 

Deux ?, mais en essayant de définir trois paramètres. En fait, vous ne pouvez pas définir des choses comme des noms de tables et de colonnes via des paramètres d'instruction préparés.

Vous devrez également épeler vos noms de variables de manière cohérente et faire quelque chose au sujet des exceptions vérifiées.

(Lorsque vous posez des questions sur le code qui provoque des erreurs, il est généralement une bonne idée de citer les erreurs.)

0

Lorsque vous utilisez PreparedStatement s vous ne sont en mesure de remplacer des valeurs, et non pas les noms des tables que vous Nous essayons de faire avec "WHERE? =?".

En ce qui concerne votre second fragment de code, mis à part l'erreur d'orthographe ("filed"), je ne vois pas pourquoi cela échouerait. Quelle erreur obtenez vous?

+0

La variable pStmt n'a pas été affectée L'instruction cn.prepareStatement (sqlQuery); doit être pStmt = cn.prepareStatement (sqlQuery); –

+0

ERREUR dans findbyid Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de '= 1' à la ligne 1null com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de '= 1' à la ligne 1 à sun.reflect.NativeConstructorAccessorImpl.newInstance0 (méthode native) – akshay

0

Dans le premier, vous avez 2 paramètres dans la requête, mais vous ajoutez un troisième, dans la deuxième déclaration que vous avez une faute de frappe ...

ResultSet findByUsername(String tablename,String field,String value) 
{ 
    pStmt = cn.prepareStatement("SELECT * FROM" + tablename +" WHERE " + field" + = ? "); 
    pStmt.setString(1,value); 
    return(pStmt.executeQuery());  
} 
+1

Je ne pense pas que '" champ "' devrait être un littéral de chaîne - 'field' est passé en paramètre. – Ash

+0

l'a changé. Merci. – npinti

0

Le deuxième essai avec un code unique sur la valeur de chaîne .

String sqlQueryString = " SELECT * FROM " + tablename +" WHERE " + filed + " = ? "); 

d'utiliser un code unique pour comparer des valeurs de chaîne. Donner un espace entre champ et égal à.

grâce

1

Je vois deux problèmes:

  1. "+ tablename +" doit être remplacé par ?
  2. WHERE ?=? est tout à fait tort en raison de la conception des déclarations préparées. Les instructions préparées sont des instructions précompilées, se référant aux mêmes tables ('s) et column (' s) avec des valeurs différentes sous les critères (valeurs liées). Vous ne pouvez pas lier un nom de table ou de colonne (ou tout autre objet db).