getUpdateCount 返回 Oracle 更新的总行数,但在 PostgreSQL 和 SQL Server 中返回 -1,在 H2 中返回最新计数

问题描述 投票:0回答:1

我正在尝试批量更新,然后获取受影响的行总数。对于 Oracle,我通过使用 getUpdateCount 获得正确的输出,但此 API 对于 PostgreSQL、SQL Server 和 H2 失败。对于这些数据库,我需要迭代并添加executeBatch 输出。

PreparedStatement preparedStatement = connection.prepareStatement(getSQL());
//created queries via addBatch()
int[] ints = preparedStatement.executeBatch();
connection.commit();
int updateCount = preparedStatement.getUpdateCount();
Assert.assertEquals(updateCount,3);
Assert.assertNotNull(ints);

我很好奇为什么这个 API 没有给出正确的输出?我的驱动程序如下。

<dependency>
    <groupId>com.oracle.ojdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>19.3.0.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <version>12.2.0.jre8</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>net.sourceforge.jtds</groupId>
    <artifactId>jtds</artifactId>
    <version>1.3.1</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.6.0</version>
    <scope>test</scope>
</dependency>
sql-server postgresql oracle jdbc
1个回答
0
投票

executeBatch
的情况下,您根本不应该检查
getUpdateCount()
,您应该仅查看返回的数组getUpdateCount()
 的行为仅与 
execute()
getMoreResults()
 组合指定。对于任何其他执行方法,它的行为是 JDBC 
未指定的,因此如果您没有调用 execute()
getMoreResults()
 (您可以通过规范仅在使用后致电
execute()
)。

也就是说,使用

executeQuery()

executeUpdate()
 进行单一执行时,大多数驱动程序通常会非常一致,就好像使用了 
execute()
 一样,但是对于 
executeBatch()
,它将很大程度上取决于批处理执行的实现方式以及更新方式计数已检索。

© www.soinside.com 2019 - 2024. All rights reserved.