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

Java JDBC getUpdateCount在SQL Server中返回0,但更新了1行,java,sql-server,sql-server-2008,jdbc,jooq,Java,Sql Server,Sql Server 2008,Jdbc,Jooq,有人见过这个吗?我使用的是MSSQLServer2008,我使用了两种不同的JDBC驱动程序(JTD和Microsoft的)。我运行了一个简单的语句来更新一行,它确实更新了它,但是getUpdateCount返回0。如果我对不同的表进行尝试,它会按预期返回1。是关于这张桌子的 PreparedStatement ps = conn.prepareStatement("select count(*) from foo_users where user_id = 1") ResultSet r

有人见过这个吗?我使用的是MSSQLServer2008,我使用了两种不同的JDBC驱动程序(JTD和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
有效。但我问这个问题是因为我使用了一个名为的查询库,它返回了不正确的结果,因为它调用了
execute
getUpdateCount
。最初我没有考虑这个问题,因为我认为这不是库的错。

您的更新语句需要“executeUpdate”


executeUpdate返回行数。如果没有返回记录集,“execute”只会返回false,这对于更新来说是不可能的。

所以我现在面临一个非常奇怪的问题。任何线索将不胜感激- 这是以前由其他开发人员编写的代码,我对Java和JDBC比较陌生

boolean getResultSet = cstmt.execute();
int updateCount = -1;
while (true) {
    if (getResultSet) {
        ResultSet r = cstmt.getResultSet();
        while (r.next()) {}
        r.close();
    } else {
    updateCount = cstmt.getUpdateCount();
    if (updateCount != -1) {
        // process update count if expected/wanted
    }
  }
    if ((!getResultSet) && (updateCount == -1)) {
        break; // done with loop
    }
    getResultSet = cstmt.getMoreResults();
}
我无法理解这里到底发生了什么

我有两个重复的数据库,都托管在不同的服务器上

相同的代码在一个数据库上工作,而不是在另一个数据库上工作

因此,这里,execute()在两台服务器上都返回false,但是getUpdateCount()对于一台服务器返回0,对于另一台服务器返回1/-1


无法理解getUpdateCount()和execute()的确切功能。

您不只是使用
int count=executeUpdate()的任何原因开始,而不是调用
execute()
?是。实际上,我正在使用另一个库(jOOQ),它正在调用
execute()
。也许我也应该在他们的邮件列表上发布。正如您所建议的,
executeUpdate
工作正常。您是否实际检查了
execute()
返回的值?只有当它为
false
时,才会
getUpdateCount()
返回更新计数。否则,您首先需要调用
getmoresults()
(可能多次)。现在我希望这个特定语句有一个更新计数。如果
execute
返回
true
getUpdateCount()
应该返回
-1
,但您永远不知道。是的,
execute()
返回false。运行此更新时是否触发?例如,可能触发的事件?你读了我的全部问题了吗?我解释了我没有询问
executeUpdate
的具体原因<根据Java文档,code>execute
getUpdateCount
应该可以工作。我在Oracle下也面临类似的问题。我们的产品多年来一直在使用各种Oracle数据库,getUpdateCount一直有效。然而,现在在客户的一个特定数据库上,似乎在执行insert语句后,execute返回正确的false,但getUpdateCount返回-1,而不是插入的行数(顺便说一下,大于零)。真烦人。。。