在ResultSet关闭后不允许操作,mysql

时间:2017-10-09 15:03:47

标签: java mysql resultset

每当我尝试运行此代码时,我得到:“java.sql.SQLException:在ResultSet关闭后不允许操作”。它可以在不关闭连接的情况下工作,但我很好奇为什么我会收到此错误以及关闭连接的正确方法,以下是代码:

    public ResultSet UpdateTable(){

            Connection con = connect();
            ResultSet resultset;
            Statement s = null;
            resultset = null;
        try{
            s = con.createStatement();
            resultset =  s.executeQuery("select * from customera");
            return resultset;

            }
        catch(SQLException e){
            System.out.println(e.getMessage());
            //con.close();
        }
        finally{
            try{
                s.close();
                resultset.close();
                con.close();
            }
            catch(SQLException e){
                System.out.println(e.getMessage());
            }
        }
        return null;
    }

}

2 个答案:

答案 0 :(得分:1)

您更愿意检查它们是否有任何引用,然后关闭它们。

 finally {

        if (resultset != null) {
            resultset.close();
        }

        if (s != null) {
            s.close();
        }

        if (con != null) {
            con.close();
        }

    }

我怀疑,问题

return resultset;

由于您在返回Connection之前关闭了StatementResultSet,因此ResultSet可能无效。您必须知道finally块将在返回值之前执行。这就是为什么,当您离开Connection时,您的代码正常工作。

因此,您应该将结果存储到某个数据结构中并返回。

答案 1 :(得分:0)

您的错误可能不是来自您显示的代码。相反,它是由其他代码生成的,因为您在其他代码使用它之前关闭了ResultSetStatement。 (根据文档,关闭Statement也会关闭其ResultSet。)

您可以使用此方法中的ResultSet调用您需要完成的任何代码,或者您可以返回ResultSet并让调用代码负责关闭它。您的决定可能取决于您的其他代码,但我更愿意将其作为调用代码的责任(因为它专门从此方法获得ResultSet,它应该知道它必须关闭它。)

作为旁注,您应该更好地区分您的异常消息,以便了解它们的来源。