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);
大家,我知道查询是正确的,如果我输入值。我的猜测我的错误是在预备陈述中的某个地方 我收到了MySQLSyntaxErrorException:
答案 0 :(得分:3)
我认为你不能使用占位符来动态传递列名,你的查询应该是:
"UPDATE fullhouse.toernooi SET colname = ? WHERE toernooi.T_code = ?"
答案 1 :(得分: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
来电中的索引参数。
答案 2 :(得分:0)
当你使用绑定变量时,它意味着语句是预编译的,并且在下次执行时,它会更快。您正在尝试将列的名称设置为绑定变量,这是不可能的。
因为你显然需要更新几个不同的列,为了达到一定的速度,你应该声明几个预备语句,每列一个。将它们保存在HashMap<String, PreparedStatement>
答案 3 :(得分:0)
预准备语句的列名不能是动态的,因为根据列名,查询计划将大不相同(例如,有时表扫描将是最快的,有时使用索引,有时甚至更深奥)。
如果SQL不能依赖某个计划是最快的,那么每次都需要提出一个新计划 - 这意味着制作一个准备好的声明是没有意义的,这就是为什么你不能这样做。 / p>