为什么Sybase JDBC驱动程序"吃掉"异常?

Gre*_*her 1 java sybase jdbc sqlexception

我正在使用官方的Sybase JDBC驱动程序连接到数据库并通过创建CallableStatement调用存储过程,将参数绑定到它并在其上调用.execute().

但是,我发现即使存储过程失败,也不会抛出任何异常.我可以通过使用Wireshark嗅探到数据库的流量并观察返回的错误消息来验证故障是否传播回给我.

最后我发现使用.executeUpdate()而不是.execute()确实给了我例外,但是我还有两个问题:

  1. 为什么.execute()和.executeUpdate()表现不同?从接口的SUN文档看来,它们应该(几乎)做同样的事情......
  2. 在调用存储过程时,用.executeUpdate()替换.execute()是否总是合适的?存储过程是否必须符合某些特定要求才能使用.executeUpdate()进行调用?(例如,它必须有更新/删除/插入语句作为最后一步吗?)

更新:我已经尝试过jTDS,它的行为正确(如:在两种情况下都抛出SQLException - 使用.execute()和.executeUpdate()).但是,由于我无法控制的限制,切换驱动程序实际上是不可能的.

另外:我对此存储过程返回的结果不感兴趣,它是一个插入/更新类型过程.我只会被插入以查看(并且能够捕获/记录)它是否失败.我尝试过的另一件事是在.execute()之后从连接中获取警告,但它也没有包含任何内容.

Ada*_*kes 5

因为那些Sybase人都很疯狂,所以这就是为什么它会吃Exceptions!没有理由避免对准备/可调用语句使用executeUpdate().如果这是你必须使用它来使它工作,那么继续这样做.但是您应该向Sybase提交错误报告 - 驱动程序没有理由这样做.