【问题标题】:UPDATE PreparedStatement not updating MSSQL using JDBCUPDATE PreparedStatement 不使用 JDBC 更新 MSSQL
【发布时间】:2013-11-27 05:11:29
【问题描述】:

我正在尝试使用准备好的语句使用 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);
    }
}

第一个打印语句打印出正确的值,因此我知道输入是正确的,第二个打印语句让我知道有 1 行受到影响,这是正确的。

如果我在 Management Studio 中运行脚本,脚本运行良好并更新表,但如果我从 java 项目运行脚本,则不会更新任何内容,也不会生成错误。

有问题的 db 表有 4 列:(int)project_id、(nvarchar)project_name、(int)num_bugs、(int)num_features

谁能帮我解决这个问题和/或找出问题所在?

【问题讨论】:

  • 不应该查询是 SET COLUMN_NAME = ?....
  • @Nambari 是对的。您的 SQL 语句应该有错误。您不能将列(或表)名称作为参数传递。
  • 另外,最好关闭你准备好的语句,最好在 finally 块中。

标签: java sql sql-server jdbc


【解决方案1】:

您不能以这种方式绑定列名,只能绑定变量。

我建议您在 finally 块的方法范围内关闭 PreparedStatement。你的方式是自找麻烦。

我还认为写信给System.out 是一个非常糟糕的主意。我更愿意将受影响的行数返回给用户。

【讨论】:

  • 感谢您的信息!我会将您的答案标记为已接受的答案,但您只被击败了 1 分钟。附带说明一下,我只是将 SOP 用作调试测试,不会在生产中使用它们。
  • 别担心,我不需要代表。如果你愿意,你仍然可以投票。我仍然会编写正确的代码——首先我们养成习惯,然后习惯塑造我们。
【解决方案2】:

列名不能在准备好的语句中参数化。您只能参数化字符串或数字等文字值。

【讨论】:

  • 啊...有道理,本来以为会抛出 SQL 错误,但感谢您的洞察力!
猜你喜欢
  • 1970-01-01
  • 2014-04-26
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2018-11-06
相关资源
最近更新 更多