即使进行了更改,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
,包括DELETE
、INSERT
和UPDATE
语句。
最重要的是,这意味着:永远不要调用那个方法,它完全没用。
executeUpdate
或 executeQuery
是你想要的。
--
编辑:正如马克在一个非常有用的评论中指出的那样,这个答案不应该诋毁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 * 的本机查询返回数据