在hsqlDB,java中重置游标位置

时间:2015-04-28 12:01:17

标签: 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之外的其他任何东西都失败了。

2 个答案:

答案 0 :(得分:3)

为了使其工作,语句对象必须声明为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);

答案 1 :(得分:0)

FWIW我解决了这个特殊的失败:

  if (rs.next()) {
    rs.beforeFirst(); // this line blows up
    while (rs.next()) {
        ...

转而使用此模式:

   if (rs.isBeforeFirst()) {
      while (rs.next()) {
          ...