SQLException, ResultSet закрыт, но я могу понять, почему - PullRequest
0 голосов
/ 12 января 2012

У меня проблема с java.sql.ResultSet, у меня есть java.sql.PreparedStatement, для которого я запускаю executeQuery () для возврата ResultSet, когда я пытаюсь получить результаты из получаемого запросаВозникло исключение:

Исключение: java.sql.SQLException Сообщение: операция не разрешена после закрытия ResultSet.

При поиске в Интернете выглядит, что ResultSet может в конечном итоге оказатьсязакрыт по нескольким причинам:

  1. Объект PreparedStatement, сгенерировавший его, закрыт.
  2. Объект PreparedStatement, сгенерировавший его, выполняется повторно.
  3. Объект PreparedStatement, сгенерировавший его, используется для получения следующего результата из последовательности нескольких результатов.
  4. Закрытие соединения, которое использовалось для генерации PreparedStatement.

Я проверил свой код и ничего из этого не сделал.Ниже приведен фрагмент кода, который вызывает проблему:

PreparedStatement psAccountPartyIdByEmail = null;
....
try {
    String [] nextLine;
    while ((nextLine = reader.readNext()) != null) {
        String email = nextLine[0];
        .....
        try {
            if (psAccountPartyIdByEmail == null) {
                psAccountPartyIdByEmail = session.connection().prepareStatement(SQL_GET_ACCOUNTPARTYID_BY_EMAILADDRESS);
            }

            psAccountPartyIdByEmail.setString(1, email);
            ResultSet partyIds = psAccountPartyIdByEmail.executeQuery();

            while (partyIds.next()) {
               String partyId = partyIds.getString(1);
                .....
            }
        } catch (SQLException e) {
            Debug.logError(e, "Encountered SQLException while running group service.", MODULE);
        }
    }
} catch (IOException e) {
    Debug.logError(e, "Problem reading line in file", MODULE);
}

Исключение выдается при попытке выполнить: while (partyIds.next()) {

Как я уже говорил, я никогда не закрываю соединение или оператор икак вы можете видеть, я не использую заявление до того, как пытаюсь просмотреть мой результат.

Спасибо за помощь ...

Марк

1 Ответ

0 голосов
/ 12 января 2012

Я не знаю, решит ли это эту проблему, но вы можете / должны переместить

if (psAccountPartyIdByEmail == null) {
            psAccountPartyIdByEmail = session.connection().prepareStatement(SQL_GET_ACCOUNTPARTYID_BY_EMAILADDRESS);
        }

за пределы цикла while.Кроме того, закройте ResultSet после обработки строк.Затем, когда вы все закончите, закройте ваше заявление и связь.

...