BackGroud故事:

我观察到Sybase JDBC驱动程序(jconn3)正在Statement.ExecuteUpdate(sql).上吞噬异常

SQL语句是一个Insert语句,它将行插入到表(这不是临时表)中,但是由于未知原因,Statement.ExecuteUpdate(sql)仍返回0。
此问题是随机的,似乎并非每次都发生。


我的理解是,如果没有行被更新,Statement.ExecuteUpdate(sql)将返回0。但是就插入语句而言,我不确定为什么什么也没插入就不会引发异常。

由于该代码是旧代码(正在使用JDK 1.4),并且由于某些限制,我无法更改或更新JDBC驱动程序。


可能的:

我正从一个角度考虑驱动程序在Statement,PreparedStatement和CallableStatement方面是否具有ExecuteUpdate的不同内部实现,那么我可以建议将Statement更改为CallableStatement以调用ExecuteUpdate。

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

最佳答案

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


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

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

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

由于必须为Statement#executeUpdate提供一个参数,并且必须为PreparedStatement#executeUpdate提供一个参数,因此显然必须以不同的方式实现。

07-24 21:05