将结果集光标移回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 + ">nn";
}

从聊天中,用于创建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;
}

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

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

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

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

还要注意,您当前的代码正在泄漏资源。您正在一个方法中创建一个PreparedStatement,但从未关闭它。您可能需要重新构造代码,以便在同一位置关闭语句和结果集。在当前位置关闭语句是不起作用的,因为这也会在使用ResultSet之前关闭它

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

相关内容

  • 没有找到相关文章

最新更新