【问题标题】:Can absolute function be called for moving at rows ahead in TYPE_FORWARD_ONLY ResultSet?可以调用绝对函数以在 TYPE_FORWARD_ONLY ResultSet 中向前移动行吗?
【发布时间】:2018-02-01 12:43:22
【问题描述】:

从 JAVA 7 API https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#absolute(int) 我们得到:

"SQLException - 如果发生数据库访问错误;在关闭的结果集上调用此方法或结果集类型为 TYPE_FORWARD_ONLY"

但是JAVA SE 8 II认证书放在第10章(JDBC),练习18:

String sql = "select name from animal order by id";
try (Connection conn = DriverManager.getConnection("jdbc:derby:zoo");
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery(sql)) {
    rs.absolute(0);

并且根据书上的答案不会抛出异常。那么,是否可以在 TYPE_FORWARD_ONLY ResultSet 中使用 absolute 函数向前推进?

【问题讨论】:

  • “那么,有没有可能……” - 我强烈怀疑这个问题的答案,就像许多其他 JDBC 问题的答案一样,是“它取决于您使用的特定 JDBC 驱动程序的实现。"

标签: java jdbc java-7 sqlexception


【解决方案1】:

不,您不能指望这会起作用,并且考虑到对 JDBC 的严格解释,驱动程序对 TYPE_FORWARD_ONLY 结果集执行此操作甚至是不正确的。

javadoc 明确表示ResultSet#absolute(int)

抛出:
SQLException - 如果发生数据库访问错误;这个方法被调用 封闭的结果集或结果集类型为TYPE_FORWARD_ONLY

这并不意外。想想如果你先调用absolute(5),然后在真实的TYPE_FORWARD_ONLY 结果集上调用absolute(1) 会发生什么。第一个会成功,而第二个调用不会:这是不一致的行为,应该避免。

所以那本书中的代码是错误的,作者依赖(可能甚至不知道)用于将TYPE_FORWARD_ONLY 静默升级到TYPE_SCROLL_INSENSITIVE 的特定数据库驱动程序(这是某些驱动程序所做的 -例如 - 自动提交)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 2019-10-17
    相关资源
    最近更新 更多