ResultSet преждевременного закрытия - PullRequest
0 голосов
/ 19 ноября 2009

Я собираю список переменных Page (в котором есть список книг) из работающей базы данных MYSQL. При попытке выполнить вторую итерацию в цикле while (rs.next ()) я получаю исключение SQL о том, что ResultSet уже закрыт. Нигде не вижу, чтобы этот код закрывал объект rs.

try {
    stmt = con.createStatement();
    ResultSet rs =
            stmt.executeQuery("SELECT pageURL," +
                    "pageName FROM pages GROUP BY pageName;");
    ResultSet rs2;
    while(rs.next()) { // Where the error occurs on the second pass
        Page tempP = new Page(rs.getString(1),rs.getString(2));
        rs2 = stmt.executeQuery("SELECT `books`.`itemID`,cost," +
                "title,author,shortD,longD FROM " +
                "books INNER JOIN pages ON " +
                "books.itemID=pages.itemID WHERE " +
                "pageName='" + rs.getString(2) + "';");
        while(rs2.next()) {
            tempP.addBook(new Book(rs2.getInt(1),
                    rs2.getFloat(2),rs2.getString(3),
                    rs2.getString(4),rs2.getString(5),
                    rs2.getString(6)));
        }
        pages.addPage(tempP);
    }
} catch(SQLException e) {
    System.err.print("SQLException: ");
    System.err.println(e.getMessage());
}

Вот содержимое таблицы страниц:

|pageName  |pageURL    |itemID|
-------------------------------
|Tech Books|./techbooks|1     |
-------------------------------
|Tech Books|./techbooks|2     |
-------------------------------
|Kids Books|./kidsbooks|3     |
-------------------------------
|Kids Books|./kidsbooks|4     |
-------------------------------
|Kids Books|./kidsbooks|5     |
-------------------------------

EDIT:

Хорошо, похоже, ResultSet становится недействительным, когда я снова использую Statement. У кого-нибудь есть предложения по исправлению этой ситуации?

Ответы [ 2 ]

4 голосов
/ 19 ноября 2009

Цитировать javadocs для оператора:

По умолчанию только один объект ResultSet на объект Statement может быть открыт одновременно. Следовательно, если чтение одного объекта ResultSet чередуется с чтением другого, каждый из них должен быть сгенерирован различными объектами Statement. Все методы выполнения в интерфейсе Statement неявно закрывают текущий объект ResultSet статута, если существует открытый.

Создайте два оператора или, еще лучше, используйте PreparedStatements со связанными переменными.

0 голосов
/ 19 ноября 2009

См. Документацию ResultSet :

Объект ResultSet автоматически закрывается, когда объект Statement, который его сгенерировал, закрывается, выполняется повторно или используется для получения следующего результата из последовательности из нескольких результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...