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驱动程序的开发者。