sqlite 中的“TYPE_FORWARD_ONLY”错误
Posted
技术标签:
【中文标题】sqlite 中的“TYPE_FORWARD_ONLY”错误【英文标题】:Error with "TYPE_FORWARD_ONLY" in sqlite 【发布时间】:2013-05-10 19:48:15 【问题描述】:我正在使用 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 版本不支持ResultSet
,这不是FORWARD_ONLY。
我的问题是为什么会发生这种情况,即使我没有后退?
【问题讨论】:
请注意,请遵循正常的Java命名约定(即CamelCasing);它增加了 Java 程序员的可读性 【参考方案1】:TYPE_FORWARD_ONLY ResultSet
仅支持 next()
导航,不支持 first()
、last()
、absolute(int)
、relative(int)
等方法。 JDBC 规范明确定义了在 TYPE_FORWARD_ONLY
上调用时抛出 SQLException
的那些:
ResultSet.absolute(int)
的Javadoc:
抛出:
SQLException
- 如果发生数据库访问错误;此方法在关闭的结果集上调用或结果集类型为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>>
)。
【讨论】:
以上是关于sqlite 中的“TYPE_FORWARD_ONLY”错误的主要内容,如果未能解决你的问题,请参考以下文章
SQLite3+Qt开发SQLite3简要介绍+在Qt5中的使用步骤