尝试在 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 中插入错误

UCanAccess:来自空间的意外令牌

尝试与 UCanAccess 连接时出现“未找到合适的驱动程序”错误

我正在尝试将一个简单的查询插入到 Microsoft 数据库中,并且我正在使用 UCanAccess

Android Studio 中的 UCanAccess 出现“给定文件不存在”错误