即使进行了更改,Statement.execute() 也会返回 false

Posted

技术标签:

【中文标题】即使进行了更改,Statement.execute() 也会返回 false【英文标题】:Statement.execute() returning false even though changes are made 【发布时间】: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 不,我在删除代码之前运行了代码,但是之后当我检查我的数据库时,该行不再存在。出于某种奇怪的原因,您的第二个建议确实有效!我不知道发生了什么哈哈,但谢谢! 好的已经把它作为你接受的答案 如果您发现您认为没有意义的行为,请阅读documentation。 execute() 返回的布尔值并不代表你认为的意思。 【参考方案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

可能是要走的路

【讨论】:

以上是关于即使进行了更改,Statement.execute() 也会返回 false的主要内容,如果未能解决你的问题,请参考以下文章

存储过程 SQL 编译错误中的执行错误:Statement.execute 中的标识符“TEST3”无效

即使没有更改联系人,也会调用内容观察者

为啥即使没有 SVN 更改,Jenkins 也会触发 IVY 构建?

即使在应用程序部署之后,如何永久编辑httpd.conf以便在Apache 2.4中进行更改?

Spring JPA findAll 在更改 spring.datasource.url 后返回空,即使使用 SELECT * 的本机查询返回数据

即使没有数据更改,Firestore 缓存也无法正常工作