0

下面的代码显示错误:ResultSet 关闭后不允许操作 我还没有关闭任何结果集仍然显示错误。我在另一个 ResultSet 中使用一个 ResultSet,这会导致问题吗?

int n=li10.getSelectedIndex();
    final String n1=(String) dl10.elementAt(n);
    String n2=t52.getText();
    String n3="Select Budget,Count1 FROM User Where U_Name=' "+n2+"'";
    String n4="Select Price From Player_Attributes Where Player_Name='"+n1+"'";
    try{
    Connection con=DriverManager.getConnection("jdbc:mysql://127.0.0.1/BFPL","root","ilovepepsi");
    Statement st=con.createStatement();
    ResultSet rs1=st.executeQuery(n4);
    ResultSet rs=st.executeQuery(n3);
    while(rs1.next()){
    int pr=rs1.getInt("Price");
    while(rs.next()){
    int f=rs.getInt("Budget");
    int f1=rs.getInt("Count1");
    if(f1>0 && pr<f ){
    try{
    Connection con5=DriverManager.getConnection("jdbc:mysql://127.0.0.1/BFPL","root","ilovepepsi");
    PreparedStatement st2=con5.prepareStatement("Update User_Team Set Player"+f1+"=? Where User_Name='"+n2+"'");
    st2.setString(1,n1);
    st2.executeUpdate();
    JOptionPane.showMessageDialog(p13,"Table is updated");
    }
    catch(SQLException ae){
    System.out.println("SQLException:"+ae.getMessage());
    System.out.println("SQLState:"+ae.getSQLState());
    System.out.println("VendorError:"+ae.getErrorCode());
    JOptionPane.showMessageDialog(p13,"Error in submitting data!");
    }
    f1=f1-1;
    f=f-pr;
    try{
    Connection con4=DriverManager.getConnection("jdbc:mysql://127.0.0.1/BFPL","root","ilovepepsi");
    PreparedStatement st1=con4.prepareStatement("Update User Set Budget=? Count1=? Where U_Name='"+n2+"'");
    st1.setInt(1,f);
    st1.setInt(2,f1);
    st1.executeUpdate();
    con4.close();
    JOptionPane.showMessageDialog(p13,"Data is successfully inserted in database");
    }
    catch(SQLException ae){
    System.out.println("SQLException:"+ae.getMessage());
    System.out.println("SQLState:"+ae.getSQLState());
    System.out.println("VendorError:"+ae.getErrorCode());
    JOptionPane.showMessageDialog(p13,"Error in submitting data!");
    }

    }
    else{

    JOptionPane.showMessageDialog(p13,"Either your budget is not sufficient or you have reached maximum limit of buying players");

    }
4

1 回答 1

2

每个语句只能打开一个结果集。因此,如果您在同一个语句中打开另一个,那么之前打开的任何一个都将被隐式关闭。如果您仍然尝试访问它,那么将抛出这个异常。

您的问题基本上有两种解决方案:

  1. 在同一个连接上创建 2 个语句,并让它们各自打开一个结果集。

  2. 将 2 个松散的 SQL 查询重写并合并为一个 SQL 查询,准确返回所需的结果,这样您就不需要创建多个语句。SQL JOIN 子句可能会派上用场。


与具体问题无关,您的代码中还有另一个主要问题。它正在泄漏数据库资源。您没有明确关闭所有迄今为止打开的连接、语句和结果集,甚至没有在finally块中。另请参阅在 JDBC 中应多久关闭一次连接、语句和结果集?.

于 2013-01-08T00:37:54.773 回答