对于JDBC驱动程序中的Statement,PreparedStatement和CallableStatement,ExecuteUpdate的实现是否不同?

时间:2015-08-18 16:53:22

标签: java jdbc sybase sybase-ase jconnect

BackGroud故事

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

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


Possiblilties:

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

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

1 个答案:

答案 0 :(得分:2)

  

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

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

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

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

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