我正在尝试使用预处理语句使用JDBC更新MSSQL实例,我提供了一个方法来更新表中的任何记录,当给定列名,要更新的值和更新的值时。
public void updateProjectOptions(int projectID, int number, String column){
try {
PreparedStatement ps = conn.prepareStatement("UPDATE cryptic.dbo.projects SET ? = ? WHERE project_id = ?");
int newNum = number+1;
System.out.println(projectID+" "+newNum+" "+column);
ps.setString(1, column);
ps.setInt(2, newNum);
ps.setInt(3, projectID);
int debug = ps.executeUpdate();
System.out.println("Rows affected: "+debug);
} catch (SQLException ex) {
Logger.getLogger(DAL.class.getName()).log(Level.SEVERE, null, ex);
}
}
第一个print语句打印出正确的值,所以我知道输入是正确的,第二个print语句让我知道1行是受影响的,这是正确的。
如果我在Management Studio中运行脚本,脚本运行正常并更新表,但是如果我从java项目运行脚本,则不会更新任何内容,也不会生成任何错误。
有问题的db表有4列:(int)project_id,(nvarchar)project_name,(int)num_bugs,(int)num_features
任何人都可以帮助我解决这个问题吗和/或发现错误吗?
答案 0 :(得分:2)
您不能以这种方式绑定列名,只能绑定变量。
我建议您关闭PreparedStatement
块中方法范围中的finally
。你的方式是要求麻烦。
我还打电话给System.out
写一个非常糟糕的主意。我更愿意将受影响的行数返回给用户。
答案 1 :(得分:1)
无法在预准备语句中参数化列名。您只能参数化字符串或数字等文字值。