Jaybird (Firebird JDBC) absolute() method



absolute(int row) Java Doc说:

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

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

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

试图将游标定位到列表的第一行/最后一行之外结果集将游标留在第一行之前或最后一行之后行。

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

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

但是使用Jaybird时,我得到了这个Exception:

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)我发现,当行参数为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.");
        }

有什么理由这样做吗?

提前感谢!

给定Javadoc,这是Jaybird中的一个bug。我在Jaybird 2.2.12(和3.0.0)中创建了JDBC-453来修复这个问题。我做了一些考古工作来找出为什么会这样执行。

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

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

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

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

如果试图将游标定位在结果集中的第一行/最后一行之外,则将游标置于第一行之前或最后一行之后。

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

的回报:
  如果游标在结果集中,则为true;假否则
抛出:
,,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驱动程序的开发者。

相关内容

  • 没有找到相关文章

最新更新