sqlite中“TYPE_FORWARD_ONLY”出错

时间:2013-05-10 19:48:16

标签: sql jdbc resultset

我正在使用SQLite和JDBC并且得到关于result_set为TYPE_FORWARD_ONLY的错误。

    PreparedStatement get_mileage = conn.prepareStatement("SELECT * FROM workout_log");
    ResultSet mileage_count = get_mileage.executeQuery();

    mileage_count.absolute(week_start);

    for (int i=week_start;i<=week_finish;i++){
        total_mileage+=mileage_count.getInt(1);
        mileage_count.next();
    }

错误发生在对absolute()的调用上,即使我知道它根本没有倒退。我曾尝试向prepareStatement添加标记,但它表示我的SQLite版本不支持非FORWARD_ONLY的ResultSet

我的问题是为什么会发生这种情况,即使我没有向后移动?

1 个答案:

答案 0 :(得分:3)

TYPE_FORWARD_ONLY ResultSet仅支持next()进行导航,而不支持first()last()absolute(int)relative(int)等方法。 JDBC规范明确定义了在SQLException

上调用TYPE_FORWARD_ONLY时抛出SQLException的内容

ResultSet.absolute(int)的Javadoc:

  

<强>抛出:
      TYPE_FORWARD_ONLY - 如果发生数据库访问错误;在闭合的结果集上调用此方法,或者结果集类型为TYPE_FORWARD_ONLY

使用这些方法对于TYPE_FORWARD_ONLY没有多大意义:该类型的结果集不适用于行的“随机访问”,例如可滚动的结果集。

例如first()

  • 只有在第一行(以及第一行本身)之前定位时才调用next(),所以为什么不使用absolute(int)
  • 只有当您传递的行高于当前行时才会调用relative(int),并且您永远无法返回到之前的行
  • 调用last()只有在传递正值并且永远不能回到之前的行时才会起作用
  • 调用TYPE_FORWARD_ONLY会让您跳过结果集的其余部分,而且永远不会回到之前的行

不可否认:它可能有其用途,但它会因为TYPE_SCROLL_INSENSITIVE的额外限制而不必要地使驱动程序复杂化。

如果您想要随机访问,则需要通过指定其中一种可滚动性类型TYPE_SCROLL_SENSITIVECachedRowSet来声明您想要随机访问。如果您的驱动程序不支持这些类型,那么您可能需要使用例如com.sun.rowset.CachedRowSetImpl(特别是List<? extends List<Object>>)或首先加载整个ResultSet(例如加载到{{1}})来模拟它。 )。