absolute(int row) Java说:
将光标移动到此ResultSet对象中的给定行号。如果行号为正,则光标相对于结果集的开头移动到给定的行号。第一行是第1行,第二行是第2行,依此类推。 如果给定的行号为负数,则光标移动到相对于结果集结尾的绝对行位置。例如,调用方法绝对值(-1)将游标定位在最后一行;调用方法绝对值(-2)将游标移动到下一行到最后一行,以此类推。 如果指定的行号为零,则光标移到第一行.之前。 试图将游标定位到结果集中的第一行/最后一行之后,将游标置于第一行之前或最后一行之后。 注意:调用绝对值(1)与调用第一个()相同。调用绝对值(-1)与调用same ()相同。
当将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.");
}有什么理由这样做吗?
提前感谢!
发布于 2016-09-11 08:01:10
考虑到Javadoc,这是Jaybird中的一个bug。我创建了JDBC-453来修复Jaybird 2.2.12 (和3.0.0)中的这个问题。我做了一些考古学来找出为什么这样做。
在JDBC2/Java1.3(和更早的版本)中,历史上不允许调用absolute(0)。Java1.3.1中的ResultSet.absolute的javadoc表示(强调我的):
将光标移动到此ResultSet对象中的给定行号。 如果行号为正,则光标相对于结果集的开头移动到给定的行号。第一行是第1行,第二行是第2行,依此类推。 如果给定的行号为负数,则光标移动到相对于结果集结尾的绝对行位置。例如,调用方法绝对值(-1)将游标定位在最后一行;调用方法绝对值(-2)将游标移动到下一行到最后一行,以此类推。 试图将游标定位到结果集中的第一行/最后一行之后,将游标置于第一行之前或最后一行之后。 注意:调用绝对值(1)与调用第一个()相同。调用绝对值(-1)与调用same ()相同。 返回: 如果光标位于结果集上,则转接为true;否则为false。 抛出: 如果发生数据库访问错误,则行为
0,或结果集类型为TYPE_FORWARD_ONLY。
换句话说,不允许使用0作为参数值。然而,在同一条目中,“试图将游标定位到结果集中的第一行/最后一行之后将游标置于第一行之前或最后一行之后”。意味着它应该被允许。
对于JDBC 3/ Java 1.4.2 (和Java 5),这被更改为:
抛出:
SQLException-如果发生数据库访问错误,或者结果集类型为TYPE_FORWARD_ONLY
突出显示的句子(“如果指定的行号为零,则光标移到第一行之前”)。只在JDBC4.1 (Java 7)中添加以作进一步澄清。
然而,从FBCachedFetcher的修订历史来看,这个限制是在2004年7月增加的,当时Java1.4.2已经可用了一段时间( Java 5已经准备好了)。当时我还没有加入这个项目,但我能想到的唯一原因是,该代码是用JDBC 2 TCK (技术兼容性工具包)测试的,因为这是最后一个公开可用的工具包,并将其更改为解决TCK报告的问题。
公开:我是Jaybird/Firebird JDBC驱动程序的开发人员。
https://stackoverflow.com/questions/39429401
复制相似问题