我正在使用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
。
我的问题是为什么会发生这种情况,即使我没有向后移动?
答案 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_SENSITIVE
或CachedRowSet
来声明您想要随机访问。如果您的驱动程序不支持这些类型,那么您可能需要使用例如com.sun.rowset.CachedRowSetImpl
(特别是List<? extends List<Object>>
)或首先加载整个ResultSet(例如加载到{{1}})来模拟它。 )。