Comment utiliser une variable tablename pour un État préparé en java insert [dupliquer]
cette question a déjà une réponse ici:
j'utilise un objet java PreparedStatment pour construire une série de requêtes d'insertion. L'énoncé de la requête est du format...
String strQuery = "INSERT INTO ? (col1, col2, col3, col4, col5) VALUES (?,?,?,?,?,?);";
... donc les deux valeurs de champ et le nom de table sont des variables (i.e. J'ai plusieurs tables avec le même format de colonne, chaque insert sera dirigé vers un autre). Je peux faire fonctionner les exécutes si je supprime le "?"tablename variable et Code dur, mais chaque déclaration préparée sera insérée dans une table différente, donc doit rester une variable que je peupler immédiatement avant d'exécuter la requête de lot en utilisant...
stmt.setString(1, "tableName1");
variable dynamique s'il vous plaît?
5 réponses
vous ne pouvez pas. Vous devez construire le sql avec string concatenation / placeholder avec String.format. l'énoncé préparé est pour les valeurs de la colonne et non pour le nom de la table.
vous pouvez utiliser placeholder à la place du nom de la table et le remplacer par votre tablename.
String strQuery = "INSERT INTO $tableName (col1, col2, col3, col4, col5)
VALUES (?,?,?,?,?,?);";
et remplacer quand u en vient à connaître le nom de la table
String query =strQuery.replace("$tableName",tableName);
stmt =conn.prepareStatement(query);
une alternative pourrait être String.format
:
p.ex.
String sql = String.format("INSERT INTO %s (col1, col2, col3, (etc)", myTablename);
le nom de la table ne peut pas être utilisé comme paramètre. Elle doit être codée en dur. Essayez quelque chose comme:
String tableName = "tableName1";
String strQuery = "INSERT INTO " + tableName + " (col1, col2, col3, col4, col5) VALUES (?,?,?,?,?,?);";
Vous devez l'ajouter à la chaîne d'origine:
String tableName = "some_table_name";
// some other code
String strQuery = "INSERT INTO " + tableName + " (col1, col2, col3, col4, col5) VALUES (?,?,?,?,?,?);";
avez-vous besoin du point-virgule dans le strQuery? (vous pouvez le faire, il a juste l'air un peu bizarre pour moi :-))