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.");
}
有没有理由这样做?
提前致谢!
答案 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驱动程序的开发人员。