3

我正在使用火鸟。我知道在 Firebird 中我们不能将结果集光标移回。仅支持TYPE_FORWARD_ONLYTYPE_SCROLL_INSENSITIVE尚不支持。在我的应用程序中,我想像使用 this 一样将结果集游标移回一排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;
}
4

1 回答 1

5

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

所以要获得一个可滚动的ResultSet,你需要使用

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

请参阅 .java 文档Connection.prepareStatement(sql, resultSetType, resultSetConcurrency)

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

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

于 2013-07-21T08:13:20.203 回答