在hsqlDB,java中重置光标位置

Posted

技术标签:

【中文标题】在hsqlDB,java中重置光标位置【英文标题】:reset cursor position in hsqlDB, java 【发布时间】:2015-04-28 12:01:16 【问题描述】:

我正在使用 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 之外的任何其他操作都会失败。

【问题讨论】:

【参考方案1】:

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

【讨论】:

我现在有 PreparedStatement pst = con.prepareStatement(quer, ResultSet.TYPE_SCROLL_INSENSITIVE);似乎已经成功了(我在其他地方有一个新错误,必须对代码进行更多修改,但我认为结果集现在是可滚动的。谢谢【参考方案2】:

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

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

改为切换到此模式:

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

【讨论】:

以上是关于在hsqlDB,java中重置光标位置的主要内容,如果未能解决你的问题,请参考以下文章

jquery在contenteditable div中设置光标位置

Java:光标当前位置的列号和行号

设置和获取光标位置?带有 OpenGL 的 JAVA

HJ64 MP3光标位置(java详解)

c# 动态获取当前屏幕中光标所在位置

Delphi中如何判断当前光标的位置