【问题标题】:Does implementation of ExecuteUpdate is different for Statement,PreparedStatement and CallableStatement inside JDBC driver?JDBC 驱动程序中的 Statement、PreparedStatement 和 CallableStatement 的 ExecuteUpdate 实现是否不同?
【发布时间】:2015-11-11 17:41:01
【问题描述】:

背景故事

我观察到 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 Driver 中的 Statement、PreparedStatement 和 CallableStatement 的 ExecuteUpdate 实现是否可能不同。

【问题讨论】:

  • .executeUpdate(sql) 不适用于PreparedStatement 对象;他们需要.executeUpdate(),因为 SQL 命令文本是作为.prepareStatement 调用的一部分提供的。
  • 能再详细一点吗?
  • 也只是盲目地尝试使用 PreparedStatement / CallabableStatement 代替 Statement。所以很好奇它是否真的有道理。
  • PreparedStatementCallableStatement 上调用executeUpdate(String)(或任何其他采用字符串参数的执行方法)必须抛出SQLException,这是JDBC 规范所要求的。
  • @MarkRotteveel 你可能是对的。但是驱动程序肯定会吃掉异常而不是抛出异常。一定有某种场景会发生这种事情。您能告诉我PreparedStatementCallableStatement 的驱动程序JAR 中的实现是否会有所不同?

标签: java jdbc sybase sap-ase jconnect


【解决方案1】:

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

any JDBC 驱动程序中StatementPreparedStatement 对象的.executeUpdate 实现会有所不同,因为这两个对象的工作方式不同。

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

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

由于Statement#executeUpdate 必须被赋予一个参数而PreparedStatement#executeUpdate不能被赋予一个参数,它们显然必须以不同的方式实现。

【讨论】:

  • 感谢您的解释。这是我一直在寻找的东西。如果我的理解有误,请纠正我,我认为executeUpdate 的实现对于CallableStatement 也会有所不同,对吧?
  • CallableStatement#executeUpdate 的实现可能StatementPreparedStatement 的对应实现不同。正如 Mark 在他对您的问题的评论中提到的那样,这完全取决于 JDBC 驱动程序的编写方式。
猜你喜欢
  • 2016-08-18
  • 2012-01-12
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-05
相关资源
最近更新 更多