1

背景故事

我观察到 Sybase JDBC 驱动程序 (jconn3) 正在吃异常Statement.ExecuteUpdate(sql).
SQL 语句是一个插入语句,它将一行插入到表中(这不是临时表),但Statement.ExecuteUpdate(sql)由于未知原因仍然返回 0。这个问题是随机的,似乎不会每次都发生。

Statement.ExecuteUpdate(sql)如果没有更新任何行,我的理解是返回 0。但是就像插入语句的情况一样,我不确定如果没有插入任何内容,为什么不抛出异常。
由于代码是遗留代码(正在使用 JDK 1.4)并且由于某些限制,我无法更改或更新 JDBC 驱动程序。


可能性:

如果Driver在Statement,PreparedStatement和CallableStatement方面具有不同的ExecuteUpdate内部实现,我会从一个角度考虑,那么我可以建议将Statement更改为CallableStatement以调用ExecuteUpdate。

我很想知道 Sybase JDBC 驱动程序中的 Statement、PreparedStatement 和 CallableStatement 的 ExecuteUpdate 实现是否可能不同。

4

1 回答 1

2

我很想知道 Sybase JDBC 驱动程序中的 Statement、PreparedStatement 和 CallableStatement 的 ExecuteUpdate 实现是否可能不同。

任何JDBC 驱动程序中的和对象的实现.executeUpdate都是不同的,因为这两个对象的工作方式不同。StatementPreparedStatement

Statement对象只是执行任意 SQL 语句的对象。使用 创建对象时不提供 SQL 语句Connection#createStatement,它作为参数传递给Statement#executeUpdate方法。

创建PreparedStatement对象要求我们在调用Connection#prepareStatement方法时提供 SQL 语句。SQL 语句是“预编译的”并作为对象的一部分缓存。到了执行语句的时候,我们只需要调用PreparedStatement#executeUpdate方法(不带参数),因为 SQL 代码已经“准备好”了。

由于Statement#executeUpdate 必须给出一个论点并且PreparedStatement#executeUpdate 不能给出一个论点,因此它们显然必须以不同的方式实现。

于 2015-08-24T04:46:59.813 回答