我正在使用官方 Sybase JDBC 驱动程序连接到数据库并通过创建 CallableStatement、将参数绑定到它并在其上调用 .execute() 来调用存储过程。
但是,我发现即使存储过程失败,也没有抛出异常。我可以通过使用 Wireshark 嗅探到数据库的流量并观察返回的错误消息来验证故障是否传播回给我。
最后我发现使用 .executeUpdate() 而不是 .execute()确实给了我例外,但是我还有两个问题:
- 为什么 .execute() 和 .executeUpdate() 表现不同?从界面的 SUN 文档看来,他们应该(几乎)做同样的事情......
- 调用存储过程时将 .execute() 替换为 .executeUpdate() 是否总是合适的?存储过程必须符合某些特定要求才能使用 .executeUpdate() 调用吗?(例如,它必须有一个更新/删除/插入语句作为最后一步吗?)
更新:我尝试过 jTDS,它的行为正确(如:它在两种情况下都抛出 SQLException - 使用 .execute() 和使用 .executeUpdate())。但是,由于我无法控制的限制,切换驱动程序是不可能的。
另外:我对这个存储过程返回的结果不感兴趣,它是一个插入/更新类型的过程。我只会被插入以查看(并且能够捕获/记录)它是否失败。我尝试过的另一件事是在 .execute() 之后从连接中获取警告,但它也不包含任何内容。