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

JDBC getUpdateCount is returning 0, but 1 row is updated, in SQL Server

提问人:Rob N 提问时间:2/13/2014 最后编辑:Lukas EderRob N 更新时间:12/30/2021 访问量:6136

问:

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

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.

是什么原因造成的?

回复评论的更新:是的,有效。但是我问这个问题是因为我使用的是一个名为 jOOQ 的查询库,它返回不正确的结果,因为它调用了 和 .我最初把这个问题排除在外,因为我认为这不是图书馆的错。executeUpdateexecutegetUpdateCount

java sql-server sql-server-2008 jdbc jooq

评论

3赞 Jon Skeet 2/13/2014
您不只是使用而不是打电话的任何原因吗?int count = executeUpdate();execute()
2赞 Rob N 2/13/2014
是的。我实际上正在使用另一个库(jOOQ),它正在调用.也许我也应该在他们的邮件列表上发帖。正如您的建议,工作正常。execute()executeUpdate
0赞 Mark Rotteveel 2/13/2014
你有没有实际检查过返回的值?仅当它是时,才会返回更新计数。否则,您首先需要打电话(可能多次)。现在,我期望此特定语句的更新计数。如果归还,应该归还,但你永远不知道。execute()falsegetUpdateCount()getMoreResults()executetruegetUpdateCount()-1
1赞 Lukas Eder 2/18/2014
运行此更新时是否触发任何触发器?例如,可能引发错误的触发器?
1赞 PeterHe 8/15/2019
如果连接具有 SET NOCOUNT ON,SQL 服务器将不会返回受语句影响的行

答:

0赞 Terry Carmen 7/20/2016 #1

更新语句需要“executeUpdate”。

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

评论

1赞 Rob N 7/21/2016
你读过我的整个问题吗?我解释了我没有问的具体原因. 并且应该可以工作,根据 Java 文档。executeUpdateexecutegetUpdateCount