Jaybird(Firebird JDBC)absolute()方法

Jaybird(Firebird JDBC)absolute()方法,jdbc,firebird,jaybird,Jdbc,Firebird,Jaybird,绝对值(int行)表示: 将光标移动到此ResultSet对象中的给定行号。如果行号为正数,则 光标移动到给定的行号,相对于行的开头 结果集。第一行是第1行,第二行是第2行,依此类推 开 如果给定的行号为负数,光标将移动到绝对值 相对于结果集结尾的行位置。例如 调用方法absolute(-1)将光标定位在最后一行; 调用方法absolute(-2)将光标移动到倒数第二个 划船等等 如果指定的行号为零,光标将移动到 第一排。 尝试将光标定位到列表中第一行/最后一行之外 结果集将光标保留在第一行之前

绝对值(int行)
表示:

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

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

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

尝试将光标定位到列表中第一行/最后一行之外 结果集将光标保留在第一行之前或最后一行之后 划船

注意:调用absolute(1)与调用first()相同。使命感 绝对值(-1)与调用last()相同

0
传递到
absolute(int行)
时,方法的行为应与
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)
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.");
        }
在Jaybird source
(FBCachedFetcher.java)
上搜索时,我发现当row参数为0时,它抛出一个异常:

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)
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.");
        }
private boolean absolute(int行,boolean内部)抛出SQLException{
checkScrollable();
如果(行<0){
行=行。大小()+行+1;
}
如果(行==0&&!内部){
抛出新的SQLException(“不能使用absolute()方法定位到第0行。”);
}
这样做有什么理由吗


提前感谢!

鉴于Javadoc,这是Jaybird中的一个bug。我创建Jaybird是为了在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)将光标移动到下一行,依此类推

尝试将光标定位在结果集中第一行/最后一行之外时,光标将位于第一行之前或最后一行之后

注意:调用绝对值(1)与调用first()相同。调用绝对值(-1)与调用last()相同

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

换句话说,不允许使用
0
作为参数值。但是,在同一条目中,句子“试图将光标定位在结果集中的第一行/最后一行之外,将光标保留在第一行之前或最后一行之后。”表明应该允许这样做

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

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

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

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

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