0
 int selectie = toernooienUitvoer.getSelectedRow();
        int selectiec = toernooienUitvoer.getSelectedColumn();
        String primarykey =  (String) toernooienUitvoer.getValueAt(selectie, 0).toString();
        String waarde = toernooienUitvoer.getValueAt(selectie, selectiec).toString();

        String columnaam = toernooienUitvoer.getModel().getColumnName(selectiec).toString();
        String input = JOptionPane.showInputDialog("wijzig geselecteerde data", waarde);
        toernooienUitvoer.setValueAt(input, selectie, selectiec);   


PreparedStatement stat = con.prepareStatement("UPDATE fullhouse.toernooi SET ? = ? WHERE toernooi.T_code = ?");
        stat.setString(1, columnaam);
        stat.setString(2, input);
        stat.setString(3, primarykey);

伙计们,如果我输入值,我知道查询是正确的。我猜我的错误是在preparedstatement中的某个地方我得到了一个MySQLSyntaxErrorException:

4

4 回答 4

3

我认为您不能使用占位符来动态传递列名,您的查询应该是:

"UPDATE fullhouse.toernooi SET colname = ? WHERE toernooi.T_code = ?"
于 2013-01-24T22:38:49.750 回答
3

如其他答案所述,占位符?只能用于值,不能用于表名和列名。由于您没有重复使用,PreparedStatement这很简单。

从改变

PreparedStatement stat = con.prepareStatement("UPDATE fullhouse.toernooi SET ? = ? WHERE toernooi.T_code = ?")

PreparedStatement stat = con.prepareStatement("UPDATE fullhouse.toernooi SET " + columnName + " = ? WHERE toernooi.T_code = ?")

并调整setString调用中的索引参数。

于 2013-01-24T22:42:21.847 回答
0

当您使用绑定变量时,这意味着该语句已预编译,并且在下一次执行时,它会更快。您试图将列的名称设为绑定变量,这是不可能的。

因为您显然需要更新几个不同的列,为了达到一定的速度,您应该声明几个准备好的语句,每列一个。把它们放在一个HashMap<String, PreparedStatement>

于 2013-01-24T22:40:30.977 回答
0

准备好的语句的列名不能是动态的,因为根据列名,查询计划会有很大的不同(例如,有时表扫描最快,有时使用索引,有时甚至更深奥)。

如果 SQL 不能依赖某个计划是最快的,那么它每次都需要提出一个新的计划——这意味着编写一个准备好的语句是没有意义的,这就是你不能这样做的原因。

于 2013-01-24T22:42:30.713 回答