À l'aide de Déclarations Préparées à la Table de jeu de Nom
Je suis en train d'utiliser les requêtes préparées pour définir un nom de table pour sélectionner les données à partir, mais je reçois une erreur lorsque j'essaie d'exécuter la requête.
L'erreur et de l'exemple de code est affiché en dessous.
[Microsoft][ODBC Microsoft Access Driver] Parameter 'Pa_RaM000' specified where a table name is required.
private String query1 = "SELECT plantID, edrman, plant, vaxnode FROM [?]"; //?=date
public Execute(String reportDate){
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn = DriverManager.getConnection(Display.DB_MERC);
PreparedStatement st = conn.prepareStatement(query1);
st.setString(1, reportDate);
ResultSet rs = st.executeQuery();
Des pensées sur ce qui pourrait être la cause?
- Oui, d'entrée de désinfection afin d'éviter des injections SQL!
- Si vous avez besoin de le remplacer par les noms de table dans une requête avec la même structure, il pointe à une faille dans votre conception de base de données. Au moins il souligne à plusieurs tables avec la même relation attributs. Normaliser dans un seul tableau avec une colonne "sujet".
Vous devez vous connecter pour publier un commentaire.
Un nom de table ne peut pas être utilisé en tant que paramètre. Elle doit être codée en dur. Si vous pouvez faire quelque chose comme:
org.apache.commons.lang.StringEscapeUtils.escapeSql
sur le nom de la table à assurez-vous que vous ne mettez pas votre schéma à risque.org.apache.commons.lang.StringEscapeUtils.escapeSql
. Elle a été frappée à la chambre des communes.lang3, et en tout cas ne remplace des guillemets simples avec des double guillemets simples. Il n'empêche pas d'injection SQL. Voir commons.apache.org/proper/commons-lang/article3_0.html et commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/....Cela est techniquement possible avec une solution de contournement, mais très mauvaise pratique.
Et puis quand vous le souhaitez sélectionner à partir de première_table vous définissez le paramètre avec
Ou si pas, vous le réglez à autre chose.
Comme un certain nombre de gens l'ont dit, vous ne pouvez pas utiliser une déclaration de paramètre pour un nom de table, uniquement pour les variables dans le cadre de l'état.
Basée sur le fait que vous avez une variable nom de la table avec (au moins) deux noms de table, il serait peut-être préférable de créer une méthode qui prend de l'entité que vous êtes stockage et renvoie une déclaration préparée.
Ce qui pourrait aider:
Je ne suis pas sûr que vous pouvez utiliser un PreparedStatement pour spécifier le nom de la table, juste la valeur de certains champs. De toute façon, vous pouvez essayer la même requête, mais, sans les parenthèses:
Il y a un moyen de passer le nom de la table comme une variable
Chaîne NameOfTable="test.Employé";
Chaîne Fquery="SELECT * from "+NameOfTable+" où Fait=" Non"";
Note:
il devrait y avoir un espace entre le DE et le suivant "et aussi entre" et où le mot-clé