【发布时间】: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。所以很好奇它是否真的有道理。
-
在
PreparedStatement或CallableStatement上调用executeUpdate(String)(或任何其他采用字符串参数的执行方法)必须抛出SQLException,这是JDBC 规范所要求的。 -
@MarkRotteveel 你可能是对的。但是驱动程序肯定会吃掉异常而不是抛出异常。一定有某种场景会发生这种事情。您能告诉我
PreparedStatement和CallableStatement的驱动程序JAR 中的实现是否会有所不同?
标签: java jdbc sybase sap-ase jconnect