将ResultSet光标移回Firebird

时间:2013-07-21 07:46:54

标签: java jdbc firebird resultset jaybird

我正在使用Firebird。我已经知道在Firebird中我们无法将结果集光标移回。它仅受TYPE_FORWARD_ONLY支持,而TYPE_SCROLL_INSENSITIVE尚不支持。在我的应用程序中,我想将结果集游标移回一行,就像使用此resultSet.previous()一样。我想知道是否有任何方法可以将光标移回。

查看Firebird的文档:

  

JDBC 3.0规范定义了三种类型的结果集

     
      
  • TYPE_FORWARD_ONLY :结果集不可滚动,光标只能移动    向前。当使用TRANSACTION_READ_COMMITTED隔离级别时,    结果集将返回满足搜索条件的所有行    ResultSet.next()调用的时刻。在其他情况下,结果集将仅返回    在交易开始时可见的行。
  •   
  • TYPE_SCROLL_INSENSITIVE :结果集可滚动,光标可以移动    来回,可以定位在指定的行上。只有行满足    查询执行时的条件是可见的。
  •   
  • TYPE_SCROLL_SENSITIVE :Firebird和Jaybird不支持。司机    允许应用程序要求这种类型的结果集,但是根据    JDBC规范,类型是“降级”到以前的类型和    相应的警告将添加到连接对象。
  •   
     

由于Firebird中缺少对可滚动游标的支持,因此通过将完整的结果集提取到客户端来实现它们的支持( TYPE_SCROLL_INSENSITIVE 结果集类型)。滚动发生在客户端的内存中。当结果集很大时,这会对系统内存使用和性能产生负面影响。

这只是我认为有用的一段代码:

while (res.next()) {
    if (!id.equalsIgnoreCase(res.getString("NO_TRANSFERT"))) {
        res.previous();
        break;
    }
    xml = xml + "<" + tableName + ">\n";
    for (int i = 1; i <= count; i++) {
        String columnName = rsmd.getColumnName(i);
        xml = xml + "<" + columnName + ">" + res.getString(i) + "</"
            + columnName + ">\n";
    }
    xml = xml + "</" + tableName + ">\n\n";
}

在聊天中,用于创建Statement的代码是:

public static ResultSet selectAll(String table) throws SQLException {
    String query = "SELECT * FROM " + table;
    PreparedStatement ps = connection.prepareStatement(query);
    ResultSet res = ps.executeQuery();
    return res;
}

1 个答案:

答案 0 :(得分:4)

创建Statement(或PreparedStatement)时,需要指定结果集类型,否则驱动程序将使用默认值(TYPE_FORWARD_ONLY)。< / p>

因此要获得可滚动的ResultSet,您需要使用

PreparedStatement ps = connection.prepareStatement(query, 
            ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

请参阅Connection.prepareStatement(sql, resultSetType, resultSetConcurrency)的javadoc。

另请注意,您当前的代码正在泄漏资源。您正在方法中创建PreparedStatement并且从不关闭它。您可能希望重新构建代码,以便可以在同一位置关闭语句和结果集。在当前位置关闭语句将不起作用,因为在您使用它之前,它也会关闭ResultSet

披露:我是Jaybird JDBC驱动程序的开发人员。