在 SQL 更新语句中找不到错误

Can't find an Error in SQL update statement

我正在做一个问答游戏。有出题人window。这对保存问题很有用。但是当想要更新其中一个文本字段并按保存时,就会发生错误。语法有问题吗?!

void insertCell(String tableNamer, String column, String value, int id) throws ClassNotFoundException, SQLException{
    Class.forName("org.h2.Driver");
    Connection conn = DriverManager.getConnection("jdbc:h2:file:C:/Users/Juris Puneiko/IdeaProjects/for_my_testings/src/sample/DB/Questions/For_Private/Easy", "Juris", "1");

    PreparedStatement ps = conn.prepareStatement("UPDATE ? SET ? = ? where  ID = ?");
    ps.setString(1, tableNamer);
    ps.setString(2, column);
    ps.setString(3, value);
    ps.setInt(4, id);
    ps.executeUpdate();
    ps.close();
    conn.close();
}

org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "UPDATE ?[*] SET ? = ? WHERE ID = ? "; expected "identifier"; SQL statement: UPDATE ? SET ? = ? where ID = ? [42001-196]

这是什么>>> [*]?

这是什么意思?

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();

占位符只能用于大多数 SQL 数据库中的值,不能用于标识符,如 table 或列名:

"UPDATE myTable SET myCol = ? where ID = ?" -- OK
"UPDATE ? SET ? = ? where ID = ?" -- not OK

原因是那些参数也用于准备好的语句,你向数据库发送一次查询,数据库"prepares"语句,然后您可以使用不同的值参数多次使用此准备好的语句。这可以提高 DB 性能,因为 DB 可以编译和优化查询,然后重复使用此处理过的表单 - 但要能够做到这一点,它需要知道所涉及的 table 和列的名称。


要解决此问题,您只需将 ? 保留在值中,然后手动连接 tableNamercolumn

"UPDATE " + tableNamer + " SET " + column + " = ? where ID = ?"

请记住,通过这样做,tableNamercolumn 现在可能容易受到 SQL 注入攻击。请确保您不允许用户提供或影响它们,否则会清理用户输入。