Jaybird(Firebird JDBC)的绝对()方法

时间:2016-09-10 18:42:22

标签: jdbc firebird jaybird

absolute(int row) Java Doc说:

  

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

     

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

     

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

     

尝试将光标定位在\ n中的第一行/最后一行之外   结果集将光标留在第一行之前或最后一行之后   行。

     

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

0传递给absolute(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.");
        }

有没有理由这样做?

提前致谢!

1 个答案:

答案 0 :(得分:2)

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

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

  

将光标移动到此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驱动程序的开发人员。