0

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

假设我想做两个executeQuery,一个在getRequestsFromDB方法中的另一个里面我做第一个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

4 回答 4

2

您正在重用_statement(我假设是全局的?)来获得 2 个不同的 s,但是在获得第 2 个(在内部函数内部,自动关闭第一个)之后ResultSet返回第一个(在外部函数中)-尝试使用 2ResultSet单独的陈述

于 2013-01-11T19:19:42.667 回答
0

从 Java API:

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

Statement所以你必须为第二个生成一个新的ResultSet。请不要忘记Statement分别关闭 s。

于 2013-01-11T19:28:24.983 回答
0

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

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

你正在重用你的陈述

于 2013-01-11T19:20:49.633 回答
0

请参阅ResultSet API中的此引用:

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

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

因此,第二个查询需要单独的语句。

于 2013-01-11T19:22:25.977 回答