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实现是否可能不同。
答案 0 :(得分:2)
我很想知道Sybase JDBC驱动程序中的Statement,PreparedStatement和CallableStatement的ExecuteUpdate实现是否可能不同。
任何 JDBC驱动程序中的.executeUpdate
和Statement
对象的PreparedStatement
实现会有所不同,因为这两个对象的工作方式不同。
Statement
对象只是执行任意SQL语句的对象。使用Connection#createStatement
创建对象时不提供SQL语句,它作为参数传递给Statement#executeUpdate
方法。
创建PreparedStatement
对象要求我们在调用Connection#prepareStatement
方法时提供SQL语句。 SQL语句是"预编译"并作为对象的一部分进行缓存。当执行语句的时候我们只需要调用PreparedStatement#executeUpdate
方法(没有参数),因为SQL代码已经准备好了#34;。
由于Statement#executeUpdate
必须被赋予一个参数而且PreparedStatement#executeUpdate
不能被赋予一个参数,所以它们显然必须以不同的方式实现。