获取使用 PreparedStatement 更新的行数

Posted

技术标签:

【中文标题】获取使用 PreparedStatement 更新的行数【英文标题】:Get number of rows updated with PreparedStatement 【发布时间】:2010-09-14 18:35:59 【问题描述】:

如何使用 PreparedStatement 更新多少行?

.getUpdateCount() 返回 0。

对于executeUpdate 出现错误:批处理期间发生错误:批处理必须执行或清除

我的代码:

updTrans = dataSource.getConnection().prepareStatement("update...");
updTrans.setInt(1, Integer.valueOf(transaksjonstatusid));
...
updTrans.addBatch();
upd = updTrans.executeUpdate();

【问题讨论】:

在您最后一次编辑中添加:updTrans.addBatch();然后 upd = updTrans.executeUpdate() 并得到一个错误,但正如 BalusC 提到的,你应该使用 int [] updateCounts = stmt.executeBatch();如果你使用 .addBatch(); 【参考方案1】:

您应该在使用批处理时使用PreparedStatement#executeBatch()

...
updTrans.addBatch();
upd = updTrans.executeBatch();

它返回一个int[],其中包含每个批次的更新计数。

【讨论】:

实际返回值可能取决于使用的 JDBC 实现(更准确地说,是使用的 JDBC 驱动程序)。如果您认为它与 JDBC API 文档(或 JDBC 驱动程序特定文档)相反,那么请考虑在 JDBC 驱动程序供应商/维护者处发布问题报告。我无法详细说明,因为不知道您使用的是哪一个。 一般 >= 0 返回是受影响的行, 【参考方案2】:

您是否尝试使用:

int n = preparedStatement.executeUpdate();

您可以在此处找到有关如何使用PreparedStatement 的一些说明。

【讨论】:

executeUpdate() 是否提交?因为我不需要提交哦那个阶段,我应该稍后提交,作为批量更新 如果 executeUpdate() 在事务中执行,则不,它不提交事务 提交可以通过Connection对象来设置,而不是Statement。您可以使用 conn.setAutoCommit(false);执行您的preparedStatement,然后使用conn.commit();并根据需要将自动提交设置为 true。 @sergionni executeUpdate() 不会提交,除非自动提交是 true,我相信。但是,如果您想进行批量更新,您应该使用addBatch()executeBatch()executeBatch() 返回一个 int[],其中包含批处理中每个命令的更新计数。【参考方案3】:

见Javadoc

public int executeUpdate() 抛出 SQLException

执行此 PreparedStatement 对象中的 SQL 语句,该对象必须 是 SQL INSERT、UPDATE 或 DELETE 陈述;或一条 SQL 语句 不返回任何内容,例如 DDL 声明。

返回: (1) INSERT、UPDATE 或 DELETE 语句的行数 或 (2) 0 表示不返回任何内容的 SQL 语句

抛出: SQLException - 如果发生数据库访问错误或 SQL 语句返回一个 ResultSet 对象

【讨论】:

【参考方案4】:

getUpdateCount 旨在与execute(String sql) 方法一起使用。您可能正在这样做:

String sql = "UPDATE some_table SET somecolumn = ? WHERE someId = ?";
PreparedStatement ps = connection.prepare(sql);
ps.setString(1, val);
ps.setInt(2, id);
ps.executeUpdate();

在这种情况下,您应该这样做

int rowsUpdated = ps.executeUpdate();

【讨论】:

这似乎返回匹配的行,而不一定是受我的设置(mysql)影响的行 - 这意味着已经与将要更新的值相同的行被计算在内,即使它们是'实际上没有更新。在 MySQL Workbench 中手动运行更新:0 行受影响行匹配:1 更改:0 警告:0... 而我从 Java executeUpdate() 获得 1。

以上是关于获取使用 PreparedStatement 更新的行数的主要内容,如果未能解决你的问题,请参考以下文章

无效的列索引,使用 PreparedStatement 更新

PreparedStatement 更新显示错误 ORA-00927 缺少等号

PreparedStatement:查询还是更新?

Statement和PreparedStatement批量更新

如何获取 PreparedStatement 的 SQL?

如何获取 PreparedStatement 的 SQL?