将ResultSet光标移回Firebird

Waq*_*Ali 3 java firebird jdbc resultset jaybird

我正在使用Firebird。我知道在Firebird中我们无法将结果集光标移回。仅TYPE_FORWARD_ONLYTYPE_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";
}
Run Code Online (Sandbox Code Playgroud)

在聊天中,用于创建的代码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;
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*eel 5

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

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

PreparedStatement ps = connection.prepareStatement(query, 
            ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
Run Code Online (Sandbox Code Playgroud)

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

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

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