2

absolute(int row) Java Doc说:

将光标移动到此 ResultSet 对象中的给定行号。如果行号为正,则游标移动到相对于结果集开头的给定行号。第一行是第 1 行,第二行是第 2 行,以此类推。

如果给定的行号为负数,则光标将移动到相对于结果集末尾的绝对行位置。例如,调用方法 absolute(-1) 将光标定位在最后一行;调用方法 absolute(-2) 将光标移动到倒数第二行,依此类推。

如果指定的行号为零,则光标移动到第一行之前。

尝试将游标定位到结果集中的第一行/最后一行之外,会使游标在第一行之前或最后一行之后。

注意:调用 absolute(1) 与调用 first() 相同。调用 absolute(-1) 与调用 last() 相同。

当传递0absolute(int row)方法时,应该表现为beforeFirst()将光标定位在第一行之前。

但是使用 Jaybird 我有这个异常:

Exception in thread "main" org.firebirdsql.jdbc.FBSQLException: You cannot position to the row 0 with absolute() method.
    at org.firebirdsql.jdbc.FBCachedFetcher.absolute(FBCachedFetcher.java:243)
    at org.firebirdsql.jdbc.FBCachedFetcher.absolute(FBCachedFetcher.java:232)
    at org.firebirdsql.jdbc.AbstractResultSet.absolute(AbstractResultSet.java:1371)
    at chapterA.ResultSets.main(ResultSets.java:180)

在 Jaybird 源码上搜索(FBCachedFetcher.java)我发现当 row 参数为 0 时,它会抛出一个异常:

private boolean absolute(int row, boolean internal) throws SQLException {
        checkScrollable();

        if (row < 0) {
            row = rows.size() + row + 1;
        }

        if (row == 0 && !internal) {
            throw new SQLException("You cannot position to row 0 with absolute() method.");
        }

有任何理由这样做吗?

提前致谢!

4

1 回答 1

2

鉴于 Javadoc,这是 Jaybird 中的一个错误。我在 Jaybird 2.2.12(和 3.0.0)中创建了JDBC-453来解决这个问题。我做了一些考古来找出为什么要以这种方式实施。

absolute(0)历史上,JDBC 2 / Java 1.3(及更早版本)不允许调用。Java 1.3.1 中的 javadocResultSet.absolute说(强调我的):

将光标移动到此 ResultSet 对象中的给定行号。

如果行号为正,则游标移动到相对于结果集开头的给定行号。第一行是第 1 行,第二行是第 2 行,以此类推。

如果给定的行号为负数,则光标将移动到相对于结果集末尾的绝对行位置。例如,调用方法 absolute(-1) 将光标定位在最后一行;调用方法 absolute(-2) 将光标移动到倒数第二行,依此类推。

尝试将游标定位到结果集中的第一行/最后一行之外,会使游标在第一行之前或最后一行之后。

注意:调用 absolute(1) 与调用 first() 相同。调用 absolute(-1) 与调用 last() 相同。

返回:
  如果光标在结果集上,则返回 true;否则为 false
抛出:
  SQLException - 如果发生数据库访问错误,则该行为0,或者结果集类型为TYPE_FORWARD_ONLY

换句话说0,不允许用作参数值。然而,在同一个条目中,句子“试图将光标定位在结果集中的第一行/最后一行之外,将光标留在第一行之前或最后一行之后”。表明它应该被允许。

对于 JDBC 3 / Java 1.4.2(和 Java 5),这已更改为:

抛出: SQLException - 如果发生数据库访问错误,或者结果集类型为TYPE_FORWARD_ONLY

您突出显示的句子(“如果指定的行号为零,则光标移动到第一行之前。”)仅在 JDBC 4.1(Java 7)中添加以进行进一步说明。

然而,看看 的修订历史FBCachedFetcher,这个限制是在 2004 年 7 月添加的,当时 Java 1.4.2 已经可用了一段时间(Java 5 几乎准备就绪)。当时我还没有加入这个项目,但我能想到的唯一原因是代码是用 JDBC 2 TCK(技术兼容性工具包)测试的,因为那是最后一个公开可用的代码,现在改为解决 TCK 报告的问题。

披露:我是 Jaybird/Firebird JDBC 驱动程序的开发人员。

于 2016-09-11T08:01:10.380 回答