rs.last() 函数报错:Invalid operation for forward only resultset : last。

22

我正在尝试通过以下方法获取结果集的行数:

rs.last();
int row_count = rs.getRow();

但我得到了一个Invalid operation for forward only resultset : last错误。结果集从Oracle 10g数据库中获取其数据。

这是我设置连接的方法:

    Class.forName("oracle.jdbc.driver.OracleDriver");
    String connectionString = "jdbc:oracle:thin:@" + oracle_ip_address + ":" + oracle_db_port + ":" + oracle_db_sid;
    Connection conn = DriverManager.getConnection(connectionString, oracle_db_username, oracle_db_password);
3个回答

41
ResultSet.last()和其他“绝对索引”查询操作仅在结果集为可滚动时才可用;否则,您只能通过向前迭代一个接一个地访问结果集。
下面的示例(来自javadocs)演示了如何创建可滚动的ResultSet
Statement stmt = con.createStatement(
    ResultSet.TYPE_SCROLL_INSENSITIVE,
    ResultSet.CONCUR_READ_ONLY
);
ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");

请注意,使用可滚动的查询会影响性能。 如果这个特定的 ResultSet 的目的仅仅是为了获取它的最后一个值,请考虑优化您的查询以仅返回该结果。


2
根据最新规范,我们必须向createStatement()添加两个参数 - Statement statement = con.createStatement(resultSetType, resultSetConcurrency); 如cheeken所述,我们必须传递ResultSet.TYPE_SCROLL_INSENSITIVE,但是除此之外,我们还必须传递另一个参数 - 请参考此处 - resultSetType为结果集类型;其中之一为ResultSet.TYPE_FORWARD_ONLY、ResultSet.TYPE_SCROLL_INSENSITIVE或ResultSet.TYPE_SCROLL_SENSITIVE resultSetConcurrency为并发类型;其中之一为ResultSet.CONCUR_READ_ONLY或ResultSet.CONCUR_UPDATABLE - Paresh
请帮我,当我尝试执行Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE);时,它显示“Connection中的createStatement()方法不适用于参数(int)”。 - Squareoot
@StringForever 指的是 PareshKumar 所提到的内容。 - Skynet
1
@danielad 实际上,那个方法签名一直需要两个参数。原始代码一直是错误的。我现在已经纠正了它(并更新了损坏的链接)。 - Mark Rotteveel

5
PreparedStatement ps = conn.prepareStatement ("SELECT * FROM
         EMPLOYEE_TABLE WHERE LASTNAME = ?" ,
         ResultSet.TYPE_SCROLL_INSENSITIVE , 
         ResultSet.CONCUR_UPDATABLE ,
         ResultSet.HOLD_CURSOR_OVER_COMMIT) ;

对于预处理语句,last()isLast() 方法至少需要指定类型和并发模式才能正常工作。


isLast() 不需要游标可滚动。而 last() 则需要。 - isaac.hazan
@isaac.hazan,对于任何驱动程序都不适用:https://dev59.com/lGPVa4cB1Zd3GeqP9dn7 - Vadzim
不建议在商业项目中使用ResultSet.CONCUR_UPDATABLE。如有可能,请避免使用。 - Dhruv Singhal

0
String rowCount = "SELECT COUNT(*) as numberOfRows FROM (SELECT * FROM names)";
Statement stat = con.createStatement();
ResultSet rs = stat.executeQuery(rowCount);
int lastRow = rs.getInt("numberOfRows");
System.out.println(lastRow);

不要使用 SELECT * FROM names,请使用您的查询。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接