Operation not allowed after ResultSet closed错误的解决

    技术2026-03-20  19

    现象:实现一个删除数据库前10条记录的练习时,出现了Operation not allowed after ResultSet closed的错误。 原因:由于要先进行查询操作,在while中也就是意味着rs还没有关闭,因为使用了next()函数,这时候再执行删除操作时,也就是意味着查询的rs会close,也就是没有查询的rs,就无法执行rs.next()。因此就出现了上面的错误。 解决:多条操作最好使用多个Statement对象,将查询和删除分开。修改如下:

    Statement sQuery = c.createStatement(); Statement sDelete = c.createStatement();

    完整实现如下:

    package jdbctest; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Scanner; public class TestDelete { public static void main(String[] args) { // TODO Auto-generated method stub try { Class.forName("com.mysql.cj.jdbc.Driver"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } try(Connection c = DriverManager.getConnection("jdbc:mysql://192.168.88.120:3306/db_bigdata","root","123456"); Statement sQuery = c.createStatement(); Statement sDelete = c.createStatement();){ c.setAutoCommit(false); //查询完还要执行删除操作,会使得的rs关闭 ResultSet rs = sQuery.executeQuery("select *from hero limit 0,10"); while(rs.next()){ int id = rs.getInt(1); System.out.printf("试图删除id=%d的元素\n",id); sQuery.execute("delete from hero where id = " + id); } System.out.println("是否要删除?"); Scanner input = new Scanner(System.in); while(true){ String str = input.next(); if("Y".equals(str)){ c.commit();//手动提交 System.out.println("提交删除"); break; }else if("N".equals(str)){ System.out.println("放弃删除"); break; } } }catch(SQLException e){ e.printStackTrace(); } } }
    Processed: 0.013, SQL: 9