你会那样,告诉我这里有什么不对吗? conn
为DriverManager.getConnection(DB_URL)
try {
PreparedStatement prepStmt = conn.prepareStatement(
"UPDATE week SET ?=? WHERE id>=? AND id<=?");
prepStmt.setString(1, s);
prepStmt.setFloat(2, x);
prepStmt.setInt(3, c);
prepStmt.setInt(4, d);
prepStmt.executeUpdate();
} catch(SQLException e) {
System.err.println("Error during data update");
e.printStackTrace();
}
错误在第一行&#34;尝试&#34;它就像&#34; SQL错误或缺少数据库(接近&#34;?&#34;:语法错误)&#34;。我必须补充一点,当我在cmd中使用&#34;?&#34;用价值取代它作为魅力。
答案 0 :(得分:2)
您不能将列名作为参数传递给预准备语句。您只能将值作为参数传递:
try {
PreparedStatement prepStmt = conn.prepareStatement(
"UPDATE week SET some_column_name=? WHERE id>=? AND id<=?");
prepStmt.setFloat(1, x);
prepStmt.setInt(2, c);
prepStmt.setInt(3, d);
prepStmt.executeUpdate();
} catch(SQLException e) {
System.err.println("Error during data update");
e.printStackTrace();
}
答案 1 :(得分:1)
您无法将列名传递给PreparedStatement
。你能做些什么来克服这个问题就是在字符串中改变它。
try {
PreparedStatement prepStmt = conn.prepareStatement(
"UPDATE week SET " + s + " =? WHERE id>=? AND id<=?");
prepStmt.setFloat(1, x);
prepStmt.setInt(2, c);
prepStmt.setInt(3, d);
prepStmt.executeUpdate();
} catch(SQLException e) {
System.err.println("Error during data update");
e.printStackTrace();
}
答案 2 :(得分:0)
PreparedStatement prepStmt = conn.prepareStatement(
"UPDATE week SET columnName=? WHERE id>=? AND id<=?");
答案 3 :(得分:0)
如前所述,您不能将列名或 sql语法传递给PreparedStatement
。但是,您可以使用String.format()
将任何内容传递给sql:
try {
String sql = "UPDATE week SET %s=? WHERE id>=? AND id<=?";
sql = String.format(sql , "s")
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setFloat(1, x);
prepStmt.setInt(2, c);
prepStmt.setInt(3, d);
prepStmt.executeUpdate();
} catch(SQLException e) {
System.err.println("Error during data update");
e.printStackTrace();
}
您会看到? = ?
被%s = ?
取代,后来列名被String.format
取代,随后字符串被传递给PreparedStatement
。
但是,不应将其用于传递数据,因为它违反了PreparedStatement
的目的。