【问题标题】:calling absolute() on a resultset that is not set to TYPE_SCROLL_SENSITIVE or INSENSITIVE在未设置为 TYPE_SCROLL_SENSITIVE 或 INSENSITIVE 的结果集上调用 absolute()
【发布时间】:2018-01-11 23:41:11
【问题描述】:

根据我的 OCP 学习书,以下内容不会引发异常:

try(Connection conn = DriverManager.getConnection("jdbc:derby:zoo");
  Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)){

rs.absolute(0);
rs.next();
System.out.println(rs.getString(1));
}

你可以看到 conn.createStatement() 没有像ResultSet.TYPE_SCROLL_INSENSITIVE 这样的任何参数,所以结果集一次只能向前移动一行,对吧?然而他们说没有例外。那么这是 OCP 书中的错误还是我在这里遗漏了什么?

问候

【问题讨论】:

  • 你检查过实际产生的结果集类型吗?如果方便,允许驱动程序“升级”结果集类型。此外,一些驱动程序实现是宽松的,允许的超出 JDBC 的要求,例如,一些驱动程序允许您将绝对值与只进结果集一起使用,只要行索引是当前或更高的。您还应该指定您使用的数据库和驱动程序+版本。

标签: java database jdbc resultset


【解决方案1】:

那么这是 OCP 书中的错误还是我在这里遗漏了什么?

简答:OCP 书中的错误。

下面有更长的答案...

遇到这个问题时,我的脑海中出现了完全相同的问题,所以我自己尝试了一下。果然,在运行代码时抛出了以下异常:

Exception in thread "main" java.sql.SQLException: The 'absolute()' method is only allowed on scroll cursors.
  at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
  at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
  at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
  at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
  at org.apache.derby.impl.jdbc.EmbedResultSet.checkScrollCursor(Unknown Source)
  at org.apache.derby.impl.jdbc.EmbedResultSet.absolute(Unknown Source)
  at com.stevectest.Main.main(Main.java:11)
Caused by: ERROR XJ061: The 'absolute()' method is only allowed on scroll cursors.
  at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
  at org.apache.derby.impl.jdbc.SQLExceptionFactory.wrapArgsForTransportAcrossDRDA(Unknown Source)
  ... 7 more

这与absolute method's Javadoc 一致,其中指出:

抛出:SQLException - 如果发生数据库访问错误;这种方法 在关闭的结果集上调用或结果集类型为 TYPE_FORWARD_ONLY

还发现selikoff.net OCP Study Guide webpage 上有一个勘误表条目:

572 第 10 章 #18:正确答案应该是 E。答案应该是 E,而不是 A,因为结果集类型不可缩放。错误答案 Mike Constantin 2016-02-05 待定

【讨论】:

    【解决方案2】:

    Oracle documentation 可以为您提供更多详细信息,说明为什么这不会产生任何异常。根据文档,“类型”和“并发”等参数有默认值。

    语句 createStatement() 抛出 SQLException

    创建一个 Statement 对象,用于将 SQL 语句发送到数据库。不带参数的 SQL 语句通常使用 Statement 对象执行。如果多次执行相同的 SQL 语句,使用PreparedStatement 对象可能会更高效。

    使用返回的 Statement 对象创建的结果集默认类型为 TYPE_FORWARD_ONLY,并发级别为 CONCUR_READ_ONLY。可以通过调用getHoldability()来确定创建的结果集的可保存性。

    返回:

    一个新的默认 Statement 对象

    抛出:SQLException - 如果发生数据库访问错误或在关闭的连接上调用此方法

    正如@MarkRotteveel 在他的评论中已经提到的,

    此外,一些驱动程序实现是宽松的,允许的比 JDBC 要求的更多,例如,一些驱动程序允许您将绝对值与只进结果集一起使用,只要行索引是当前或更高的行索引

    希望这能回答你的问题!

    【讨论】:

      猜你喜欢
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-25
      • 1970-01-01
      • 2011-09-01
      • 2011-10-25
      • 1970-01-01
      相关资源
      最近更新 更多