获取使用 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。 @sergionniexecuteUpdate()
不会提交,除非自动提交是 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 缺少等号