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

Mik*_*ike 17 java oracle jdbc resultset

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

rs.last();
int row_count = rs.getRow();
Run Code Online (Sandbox Code Playgroud)

但我得到一个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);
Run Code Online (Sandbox Code Playgroud)

che*_*ken 34

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");
Run Code Online (Sandbox Code Playgroud)

请记住,使用可滚动查询会对性能产生影响.如果此特定目标ResultSet仅用于获取其最后一个值,请考虑优化查询以仅返回该结果.

  • 根据最新的规范,我们必须向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`之一 (2认同)

Mah*_*ili 5

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

对于预准备语句,您必须至少指定类型并发模式last()以及isLast()工作.