可以在TYPE_FORWARD_ONLY ResultSet中调用绝对函数在前面的行中移动吗?

时间:2018-02-01 12:43:22

标签: java jdbc java-7 sqlexception

从JAVA 7 API https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#absolute(int)我们得到:

" SQLException - 如果发生数据库访问错误;在关闭的结果集上调用此方法,或者结果集类型为TYPE_FORWARD_ONLY "

但是JAVA SE 8 II认证书放在第10章(JDBC),练习18:

String sql = "select name from animal order by id";
try (Connection conn = DriverManager.getConnection("jdbc:derby:zoo");
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery(sql)) {
    rs.absolute(0);

根据书中的答案,没有例外。那么,是否可以使用绝对函数在TYPE_FORWARD_ONLY ResultSet中前进?

1 个答案:

答案 0 :(得分:1)

不,你不能指望这个工作,并且对JDBC有严格的解释,对于TYPE_FORWARD_ONLY结果集的驱动程序来说甚至是不正确的。

javadoc明确地说ResultSet#absolute(int)

  

<强>抛出:
  SQLException - 如果发生数据库访问错误;调用此方法   结束集或结果集类型为TYPE_FORWARD_ONLY

这并不意外。想一想,如果您先在真实absolute(5)结果集上调用absolute(1)然后TYPE_FORWARD_ONLY,会发生什么。第一个会成功,第二个调用不会:这是不一致的行为,应该避免。

因此该书中的代码是错误的,并且作者依赖于(可能甚至不知道)用于静默升级TYPE_FORWARD_ONLYTYPE_SCROLL_INSENSITIVE的特定数据库驱动程序(这是一些驱动程序在 - 例如 - 自动提交)。