重置hsqlDB中的光标位置,java

重置hsqlDB中的光标位置,java,java,jdbc,hsqldb,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 ####");

我正在使用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());
    }
}
也不是

工作。我收到一个异常,其中包含一条脚本消息“功能不受支持”

我在javadoc中发现了一些引用,它们说当JDBC驱动程序不支持这个操作时就会发生这种情况。我有点震惊,像移动光标这样一个非常重要的功能不受支持,我觉得很难相信,因此必须有一种不同的方法来重置光标位置,或者可能有一种替代.next()方法,允许在遍历所有内容时重置光标位置


注意:.previous()也不起作用,所以除next之外的任何操作都会失败

为使其正常工作,必须将语句对象声明为
ResultSet。键入\u SCROLL\u INSENSITIVE

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

如果您使用的是
preparedstement
,请如下使用:

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

FWIW我绕过了这个特殊的失败:

  if (rs.next()) {
    rs.beforeFirst(); // this line blows up
    while (rs.next()) {
        ...
通过切换到此模式:

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

现在我有了PreparedStatement pst=con.prepareStatement(query,ResultSet.TYPE\u SCROLL\u不敏感);似乎已经做到了(我在其他地方有一个新的bug,需要对代码进行更多修改,但我认为结果集现在可以滚动了。谢谢
  if (rs.next()) {
    rs.beforeFirst(); // this line blows up
    while (rs.next()) {
        ...
   if (rs.isBeforeFirst()) {
      while (rs.next()) {
          ...