【发布时间】: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 的查询库,它返回了不正确的结果,因为它调用了execute 和getUpdateCount。我最初没有考虑这个问题,因为我认为这不是图书馆的错。
【问题讨论】:
-
有什么理由不只是使用
int count = executeUpdate();开始,而不是调用execute()? -
是的。我实际上正在使用另一个调用
execute()的库(jOOQ)。也许我也应该在他们的邮件列表上发帖。正如您所建议的,executeUpdate工作正常。 -
你真的检查过
execute()返回的值吗?只有当它是false时,getUpdateCount()才会返回更新计数。否则,您首先需要致电getMoreResults()(可能多次)。现在我希望这个特定语句的更新计数。如果execute返回true,getUpdateCount()应该返回-1,但你永远不知道。 -
运行此更新时是否会触发任何触发器?例如。可能会触发raise an error?
-
如果连接设置了 SET NOCOUNT ON,SQL server 不会返回受语句影响的行
标签: java sql-server sql-server-2008 jdbc jooq