ResultSet关闭后不允许ResultSet,空指针异常和SQLException操作

时间:2013-01-11 19:14:52

标签: java sql

我是java和SQL的新手,我重复一个我不知道如何避免它的问题:

假设我想在getRequestsFromDB方法中创建两个executeQuery,一个在另一个内部,我创建第一个executeQuery,在第二个方法isProfessionalHasThatProfession中,我创建第二个executeQuery:

 private Vector<ClientRequest> getRequestsFromDB() throws SQLException {
    Vector<ClientRequest> retVal = new Vector<ClientRequest>();
    ResultSet result = null;
    try {
        for (int i=0 ; i<_userBean.getProfession().length ; ++i ){
            result = _statement.executeQuery("SELECT * FROM "+_dbName+"."+CLIENTS_REQUEST_TABLE+" WHERE "+CLIENTS_REQUEST_T_PROFESSION+"='"+_userBean.getProfession()[i]+"'");               
            while(result.next()){ //HERE IN THE SECOND LOOP GETTING NULL EXCEPTION

                if(isProfessionalHasThatProfession(result.getString(CLIENTS_REQUEST_T_PROFESSION))){
                    retVal.add(cr);
                    ClientRequest cr = new ClientRequest
                            (result.getString(CLIENTS_REQUEST_T_CLIENT_ID), 
                            result.getString(CLIENTS_REQUEST_T_CITY),
                            result.getString(CLIENTS_REQUEST_T_DATE),
                            result.getString(CLIENTS_REQUEST_T_PROFESSION));
                }
            }
        }
    } catch (SQLException ex) {
        throw ex;
    }
    return retVal;
}

第二个功能:

private boolean isProfessionalHasThatProfession(String profession) throws SQLException {             
    ResultSet result = null;
    try {
        result = _statement.executeQuery("SELECT "+WORKER_PROFESSIONS_T_PROFESSION+" FROM "+_dbName+"."+WORKER_PROFESSIONS_TABLE+" WHERE "+WORKER_PROFESSIONS_T_PROFESSIONAL_ID+"='"+_userBean.getProId()+"'");
        while(result.next()){
            if(result.getString(1).equals(profession)){
                return true;
            }
        }
    } catch (SQLException ex) {
        throw ex;
    }
    return false;
}

在第二个循环中我得到一个SQLException:“在ResultSet关闭后不允许操作”,我试过: 最后用result.close()关闭结果,但我也得到异常空指针异常。

我真的不知道如何处理这些想法? 谢谢!

4 个答案:

答案 0 :(得分:2)

你重新使用_statement(我假设它是全局的吗?)获得2个不同的ResultSet s,但是在你得到之后你会回到第一个ResultSet(在外部函数中)第二个(内部函数内部,自动关闭第一个) - 尝试使用2个单独的语句

答案 1 :(得分:0)

检查此链接:http://download.oracle.com/javase/1.4.2/docs/api/java/sql/Statement.html

默认情况下,每个Statement对象只能同时打开一个ResultSet对象。因此,如果读取一个ResultSet对象与另一个ResultSet对象的读取交错,则每个ResultSet对象必须由不同的Statement对象生成。如果存在一个开放的对象,则Statement接口中的所有执行方法都会隐式关闭该语句的当前ResultSet对象。

您正在重复使用您的陈述

答案 2 :(得分:0)

ResultSet API

中查看此引文
  • 当生成它的Statement对象关闭,重新执行或用于从多个结果序列中检索下一个结果时,ResultSet对象会自动关闭。

看起来您正在使用一个类或全局范围的Statement(_statement),它支持您尝试迭代的结果集,并查询结果集中每个条目的某种类型的详细信息。 isProfessionalHasThatProfession方法。但是当您使用相同的Statement执行新查询时,旧的ResultSet将被关闭。

因此,您需要为第二个查询单独声明。

答案 3 :(得分:0)

来自Java API:

  

默认情况下,每个Statement对象只能打开一个ResultSet对象   同时。因此,如果读取一个ResultSet对象是   与另一个的读取交错,每个必须已经生成   通过不同的Statement对象。

因此,您必须为第二个Statement生成新的ResultSet。请不要忘记分别关闭Statement