rs.last()为仅向前结果集提供无效操作:last

我试图通过以下方式获得结果集的行数:

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

但是我只获得了Invalid operation for forward only resultset : lastInvalid 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); 

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的目标仅是获取其最后一个值,请考虑优化查询以仅返回该结果。

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

对于预准备语句,您必须至少指定last()isLast()的类型并发模式。

感谢cheeken(上面的2个post),但在Java 1.8中,createStatement()函数现在需要2个参数

例:

 stmt = conx.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE ,ResultSet.CONCUR_READ_ONLY );