尝试在 UCanAccess ResultSet 上使用 .previous() 方法
Posted
技术标签:
【中文标题】尝试在 UCanAccess ResultSet 上使用 .previous() 方法【英文标题】:Trying to use the .previous() method on a UCanAccess ResultSet 【发布时间】:2015-07-28 15:44:54 【问题描述】:我正在处理来自 Facebook 的批处理信息。
我已经决定获得我想要的结果的最佳方法是有 2 个循环,而两者都是关于我的结果集是否有 .next()
....
问题是结果集没有hasNext()
方法,而只有next()
。
因此,我尝试在使用 .previous()
的第一个 .next()
方法之后返回,但出现“不支持的功能”错误。
所以我在第二个 .next()
之后又试了一次,结果还是一样....
您似乎无法在 UCanAccess 下使用.previous()
。
例外是——
net.ucanaccess.jdbc.UcanaccessSQLException: feature not supported
at net.ucanaccess.jdbc.UcanaccessResultSet.previous(UcanaccessResultSet.java:933)
代码部分-
int i = 1;
try
idsLoop:while(rs.next())
if(i==1)
rs.previous();
if(i<50)
idsForRequest.add(rs.getString("Expr1"));
i++;
else
i=1;
break idsLoop;
顺便说一句,如果有人想知道我为什么这样做,是因为我不想一次批处理超过 50 页。
【问题讨论】:
【参考方案1】:UCanAccess 下的 JDBC 语句对象默认为 ResultSet.TYPE_FORWARD_ONLY
(如果不是全部,也是大多数 JDBC 驱动程序),因此如果您执行类似的操作,rs.previous()
将失败
try (Statement st = conn.createStatement())
try (ResultSet rs = st.executeQuery(sql))
// ...
rs.previous(); // <- error
但是,如果您在创建 Statement 对象时指定了可滚动的 ResultSet ...
try (Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY))
try (ResultSet rs = st.executeQuery(sql))
// ...
rs.previous(); // <- no error
...那么rs.previous()
就可以了。
【讨论】:
以上是关于尝试在 UCanAccess ResultSet 上使用 .previous() 方法的主要内容,如果未能解决你的问题,请参考以下文章
当 Jackcess 连接正常时,UCanAccess 驱动程序在尝试连接 Access 数据库时抛出异常
尝试与 UCanAccess 连接时出现“未找到合适的驱动程序”错误