java - 重置 hsqlDB、java 中的光标位置

标签 java jdbc hsqldb

我正在使用 hsqlDB 版本 2.3.2,并将其嵌入到一个小程序中。到目前为止一切正常,我制作了一个简单的打印机方法,允许 mi 在控制台中打印结果集:

public static void printResultSet(ResultSet rs){
    try {
        if(rs==null || rs.wasNull()) {
            System.out.println("####  empty result set ####");
            return;
        }
        ResultSetMetaData rsmd = rs.getMetaData();
        int cols = rsmd.getColumnCount();
        System.out.println("############## Printers.resultset ################");
        while(rs.next()){
            System.out.println("");
            for(int i=1; i<cols+1; i++){
                try{
                    System.out.print(rs.getString(i) + ", ");
                }catch(SQLException e){
                    /*drop silently - while it's a bad programming practice to rely on 
                     * exceptions, it's easiest to handle when unknown data types may appear
                     */
                }
            }
        }
        //rs.absolute(0); //reset rs cursor
        rs.beforeFirst();
        System.out.println("###  DONE  ### Printers.resultset ################");
    } catch (SQLException e) {
        System.err.println("SQL exceptin in Printers.printResultSet" + e.getMessage());
    }
}

据我了解,rs.next() 会导致结果集光标移动一位,直到其他内容改变它(可以是 next() 的下一次调用)。因此,打印机的调用导致光标最终位于结果集的末尾,从而使我的代码的其他部分无法使用结果集。我正在尝试重置光标位置,以便可以在不更改外部代码的情况下使用打印机方法,但由于某种原因我无法重置 - 也无法重置

        rs.absolute(0); 

也不

        rs.beforeFirst();

有效。我收到异常消息“功能不支持”

我在 javadoc 中找到了一些引用资料,指出当 JDBC 驱动程序不支持此操作时会发生这种情况。我有点震惊,不支持像移动光标这样非常重要的功能,我觉得很难相信,所以必须有不同的方法来重置光标位置,或者可能有 .next( 的替代方法) ) 方法,允许在迭代完所有内容后重置光标位置。

注意:.previous() 也不起作用,因此除 next 之外的任何其他操作都会失败。

最佳答案

为了使其正常工作,语句对象必须声明为 ResultSet.TYPE_SCROLL_INSENSITIVE:

Statement stmt = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
    ResultSet.CONCUR_READ_ONLY);

示例 here

如果您使用PreparedStetement,请像这样使用它:

PreparedStatement prepStmt =
        dbCon.prepareStatement(sqlStr, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

关于java - 重置 hsqlDB、java 中的光标位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29918918/

相关文章:

java - 如何读取 Tomcat JDBC 数据源资源工厂属性?

java - Hibernate更新某个值

java - Php 与 Java 数据库字符串比较

java - 如何告诉 Mockito Mock 注释返回一个不为 null 的模拟对象?

java - 如果 autocommit 设置为 true,我的批处理是否真的按预期执行?

jdbc - 有没有办法查看Calcite JDBC执行的物理SQL?

java - 如何让 HSQLDB 在从 .script 文件初始化数据源期间发出错误消息?

java - 具有自动增量部分的复合主键

java - Eclipse 无法识别代码更改

java - 如何使用poi从excel表中检索百分比类型的值