【问题标题】:Statement.execute() returning false even though changes are made即使进行了更改,Statement.execute() 也会返回 false
【发布时间】:2021-08-06 18:33:43
【问题描述】:

我的这段代码在这里:

sql = "DELETE FROM assignments WHERE assign_mark = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, d1);

boolean rows = statement.execute();
if (rows == true) {
    new ViewDatabase(user, name, pswrd);
    System.out.println("ASSIGN - ASSIGN_MARK UPDATE SUCCESSFUL!");
    frame.setVisible(false);
} else if (rows == false) {
    JOptionPane.showMessageDialog(null, "Cannot find row!",
              "ERROR", JOptionPane.ERROR_MESSAGE);
}

statement.close();
connection.close();

输入 d1 的值(对应于我数据库中现有数据的正确列)后,我得到“找不到行!”价值。但是,当我检查我的数据库时,列名中带有 d1 的行不见了。我不确定我在这里对概念有什么错误/误解。

【问题讨论】:

  • 已经删除之后运行了代码?您还需要检查驱动程序为删除返回的内容。返回值可能并不像您认为的那样
  • 你可能会更好:int numColsAffected = statement.executeUpdate();
  • @g00se 不,我在删除代码之前运行了代码,但是之后当我检查我的数据库时,该行不再存在。出于某种奇怪的原因,您的第二个建议确实有效!我不知道发生了什么哈哈,但谢谢!
  • 好的已经把它作为你接受的答案
  • 如果您发现您认为没有意义的行为,请阅读documentationexecute() 返回的布尔值并不代表你认为的意思。

标签: java mysql jdbc


【解决方案1】:

execute() 调用返回 true 如果结果会返回 ResultSet 对象;它返回false 否则,即如果它不想返回任何内容或更新计数。

就几乎所有意图和目的而言,这意味着execute()SELECT 语句返回true,为其他所有语句返回false,包括DELETEINSERTUPDATE 语句。

最重要的是,这意味着:永远不要调用那个方法,它完全没用。

executeUpdateexecuteQuery 是你想要的。

--

编辑:正如马克在一个非常有用的评论中指出的那样,这个答案不应该诋毁execute()。假设返回的布尔值有点奇怪,但这并不是 JDBC API 中唯一有点不直观的地方。该方法有其用途;这只是解决这个特定问题的正确方法。请阅读评论以获取更多详细信息:)

【讨论】:

  • execute() 并非“完全没用”,它对于 1) 执行未知类型的语句非常有用,允许您动态处理结果类型,2) 执行具有多个结果集的语句(例如多个结果集,或一系列结果集和更新计数)。此外,在某些数据库系统上,使用 execute() 而不是 executeUpdate 可能会带来性能优势(例如,当请求更新计数需要额外的网络往返时)
【解决方案2】:
int numColsAffected = statement.executeUpdate();
if (numColsAffected > 0) {
   // Success
}
else {
   // Failure
}

可能是要走的路

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2014-11-13
    • 2017-06-24
    • 2021-07-06
    • 1970-01-01
    • 2017-10-20
    相关资源
    最近更新 更多