0

JavaとSQLの新機能ですが、回避方法がわからないという問題を繰り返しています。

getRequestsFromDBメソッドで2つのexecuteQueryを作成し、最初のexecuteQueryを作成し、2番目のメソッドisProfessionalHasThatProfessionで2番目の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;
}

2番目の関数:

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;
}

2番目のループでSQLExceptionを取得しています:「ResultSetが閉じた後に操作は許可されていません」、私は試しました:result.close()で結果を閉じますが、例外nullポインター例外も取得します。

私は本当にそれに対処する方法がわからない、アイデア?ありがとう!

4

4 に答える 4

2

youreを再利用して_statement(私はグローバルだと思いますか?)2つの異なるを取得しますが、2番目(内部関数内で1番目を自動的に閉じます)を取得した後ResultSet、1番目(外部関数内)に戻ります-2を使用してみてくださいResultSet別のステートメント

于 2013-01-11T19:19:42.667 に答える
0

このリンクを確認してください:http://download.oracle.com/javase/1.4.2/docs/api/java/sql/Statement.html

デフォルトでは、Statementオブジェクトごとに1つのResultSetオブジェクトのみを同時に開くことができます。したがって、あるResultSetオブジェクトの読み取りが別のオブジェクトの読み取りとインターリーブされている場合、それぞれが異なるStatementオブジェクトによって生成されている必要があります。Statementインターフェースのすべての実行メソッドは、開いているオブジェクトが存在する場合、ステートメントの現在のResultSetオブジェクトを暗黙的に閉じます。

そして、あなたはあなたの声明を再利用しています

于 2013-01-11T19:20:49.633 に答える
0

ResultSetAPIからのこの引用を参照してください。

  • ResultSetオブジェクトは、それを生成したStatementオブジェクトが閉じられるか、再実行されるか、複数の結果のシーケンスから次の結果を取得するために使用されると、自動的に閉じられます。

クラスまたはグローバルスコープステートメント(_statement)を使用しているようです。これは、反復しようとしている結果セットと、メソッドの結果セットの各エントリに対して何らかのクエリの詳細の両方をサポートしますisProfessionalHasThatProfession。ただし、同じで新しいクエリを実行するとStatement、古いResultSetは閉じられます。

したがって、2番目のクエリには別のステートメントが必要になります。

于 2013-01-11T19:22:25.977 に答える
0

Java APIから:

デフォルトでは、Statementオブジェクトごとに1つのResultSetオブジェクトのみを同時に開くことができます。したがって、あるResultSetオブジェクトの読み取りが別のオブジェクトの読み取りとインターリーブされている場合、それぞれが異なるStatementオブジェクトによって生成されている必要があります。

したがってStatement、2番目の新しいを生成する必要がありますResultSet。それぞれsを閉じることを忘れないでくださいStatement

于 2013-01-11T19:28:24.983 に答える