-2
String sql = "UPDATE `test`.`books` SET ? = ? WHERE `isbn` = ?;";
            PreparedStatement ps = null;
            ps = conn.prepareStatement(sql);
            ps.setString(1,whatToUp);
            ps.setString(2, data);
            ps.setString(3, isbn);
            ps.executeUpdate(sql);
            System.out.println("Statement executed");
            conn.close();

错误说 query 有问题。我正在使用 MySQL 5.6。我从工作台 6.0 中复制了该语句,然后放在?我需要的任何地方。

即使这样也会出现错误:

String sql = "UPDATE `test`.`books` SET `title` = ? WHERE `isbn` = ?;";
            PreparedStatement ps = null;
            ps = conn.prepareStatement(sql);
            ps.setString(1, data);
            ps.setString(2, isbn);
            ps.executeUpdate(sql);
            System.out.println("Statement executed");
            conn.close();
4

3 回答 3

8

您可以动态构建查询

String sql = "UPDATE `test`.`books` SET " + whatToUp + " = ? WHERE `isbn` = ?;";
PreparedStatement ps = null;
ps = conn.prepareStatement(sql);
ps.setString(1, data);
ps.setString(2, isbn);
ps.executeUpdate(); // you need to use the overloaded method without an argument

请注意,您很容易受到 SQL 注入的攻击。

如果由于某种原因是错误的,请删除所有引号。

String sql = "UPDATE test.books SET " + whatToUp + " = ? WHERE isbn = ?;";

如果这不起作用,那么您的架构不匹配。这取决于你。

在我急于回答我没有看到你在使用

ps.executeUpdate(sql); 

这个方法的javadoc说

注意:不能在 PreparedStatement 或 CallableStatement 上调用此方法。

你必须使用

ps.executeUpdate(); 

因为您已经向该方法提供了 sql 语句。

如果您刚刚提供了异常堆栈跟踪,所有这些都将很快得到解决。下次你问问题时考虑一下

于 2013-08-29T19:34:55.043 回答
2

问题是您正在调用executeUpdate(String)a PreparedStatement,文档说:

SQLException- [...],该方法在or上调用PreparedStatementCallableStatement

您需要使用executeUpdate()(所以没有参数)来执行PreparedStatement. 原因是:准备好的语句已经知道它的查询(创建它的那个),所以在执行它时提供查询是没有意义的。

请注意,MySQL 实现并不完全符合 JDBC。它实际上确实允许在String此处执行,但由于参数占位符,它会导致语法错误。

您的第一段代码将永远无法工作,因为参数只能用于值的位置,而不是需要对象名称(如表名称)的位置。

于 2013-08-30T07:31:14.710 回答
0

@SotiriosDelimanolis 给了你答案。

只是以不同的方式构建 SQL 字符串

Stringbuilder sql = new Stringbuilder("UPDATE test.books SET ");
sql.append(whatToUp);
sql.append(" = ? WHERE isbn = ?");
PreparedStatement ps = null;
ps = conn.prepareStatement(sql.toString());
ps.setString(1, data);
ps.setString(2, isbn);
ps.executeUpdate(sql.toString());
System.out.println("Statement executed");
conn.close();
于 2013-08-29T19:37:29.143 回答