JDBC getUpdateCount 在 SQL Server 中返回 0,但更新了 1 行

Posted

技术标签:

【中文标题】JDBC getUpdateCount 在 SQL Server 中返回 0,但更新了 1 行【英文标题】:JDBC getUpdateCount is returning 0, but 1 row is updated, in SQL Server 【发布时间】:2014-03-12 12:08:02 【问题描述】:

有人见过这个吗?我正在使用 MS SQL Server 2008,并且我已经尝试使用两种不同的 JDBC 驱动程序(jtds 和 Microsoft 的)。我运行了一个简单的语句来更新一行,它确实更新了它,但是getUpdateCount 返回 0。如果我尝试对不同的表执行此操作,它会按预期返回 1。这是关于这张桌子的东西。

PreparedStatement ps = 
  conn.prepareStatement("select count(*) from foo_users where user_id = 1")
ResultSet rs = ps.executeQuery();
rs.next()
println(" count(*) is " + rs.getInt(1));    // Prints 1

ps = conn.prepareStatement("update foo_users set is_admin = 1 where user_id = 1")
ps.execute()
int count = ps.getUpdateCount()
println(" update count is " + count)        // Prints 0.  WTF.

这是什么原因造成的?

根据评论更新: 是的,executeUpdate 有效。但我问这个问题是因为我使用了一个名为jOOQ 的查询库,它返回了不正确的结果,因为它调用了executegetUpdateCount。我最初没有考虑这个问题,因为我认为这不是图书馆的错。

【问题讨论】:

有什么理由不只是使用int count = executeUpdate(); 开始,而不是调用execute() 是的。我实际上正在使用另一个调用execute() 的库(jOOQ)。也许我也应该在他们的邮件列表上发帖。正如您所建议的,executeUpdate 工作正常。 你真的检查过execute()返回的值吗?只有当它是 false 时,getUpdateCount() 才会返回更新计数。否则,您首先需要致电getMoreResults()(可能多次)。现在我希望这个特定语句的更新计数。如果execute返回truegetUpdateCount()应该返回-1,但你永远不知道。 运行此更新时是否会触发任何触发器?例如。可能会触发raise an error? 如果连接设置了 SET NOCOUNT ON,SQL server 不会返回受语句影响的行 【参考方案1】:

您的更新语句需要“executeUpdate”。

executeUpdate 返回行数。如果没有返回记录集,“执行”只会返回 false,而 UPDATE 则不会。

【讨论】:

您阅读了我的整个问题吗?我解释了我不询问executeUpdate 的具体原因。根据 Java 文档,executegetUpdateCount 应该可以工作。

以上是关于JDBC getUpdateCount 在 SQL Server 中返回 0,但更新了 1 行的主要内容,如果未能解决你的问题,请参考以下文章

在JDBC中实现SQL语句的模糊查询

log4jdbc打印完整SQL

使用 JDBC 执行 .sql 文件

在 JDBC 中编写 SQL 查询的最佳实践是啥

JDBC 复习4 批量执行SQL

java.sql.SQLFeatureNotSupportedException:方法 org.postgresql.jdbc4.Jdbc4Connection.isValid(int) 尚未实现。在