我正在做一个问答游戏。有提问者窗口。哪个对保存问题有用。但是当要更新文本字段之一并按保存时,就会发生错误。语法有问题吗?!
Move File oldName.txt newName.txt
org.h2.jdbc.JdbcSQLException:SQL语句“ UPDATE?[*] SET?=?WHERE ID =?”中的语法错误;预期的“标识符”; SQL语句: 更新?设置? =?其中ID =? [42001-196]
这是什么>>> [*]?
这是什么意思?
答案 0 :(得分:3)
String sql = "UPDATE " + tableNamer + " SET " + column + " = ? where ID = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, value);
ps.setInt(2, id);
ps.executeUpdate();
ps.close();
conn.close();
答案 1 :(得分:2)
占位符只能用于大多数SQL数据库中的值,不能用于表或列名之类的标识符:
"UPDATE myTable SET myCol = ? where ID = ?" -- OK
"UPDATE ? SET ? = ? where ID = ?" -- not OK
原因是这些参数还用于准备好的语句,在该语句中,您将查询发送到数据库一次,数据库“准备”了该语句,然后您可以在许多情况下使用此准备好的语句时间使用不同的值参数。这可以提高数据库性能,因为数据库可以编译和优化查询,然后重复使用此处理后的表单-但是要做到这一点,它需要知道所涉及的表和列的名称。
要解决此问题,只需保留?
的值,然后手动将tableNamer
和column
串联起来:
"UPDATE " + tableNamer + " SET " + column + " = ? where ID = ?"
请记住,尽管如此,tableNamer
和column
现在可能容易受到SQL注入的攻击。确保您不允许用户提供或影响他们,或者清理用户输入。