Исключение Java SQL: закрытый набор результатов: следующий, даже если ни соединение, ни набор результатов не закрыты - PullRequest
0 голосов
/ 29 апреля 2018

По сути, у меня есть следующий метод, который позволяет получить идентификатор из таблицы оракулов:

public Integer findByName(String name) throws SQLException {
    Connection con = Database.getConnection();
    try (Statement stmt = con.createStatement();
         ResultSet rs = stmt.getResultSet()) {
        stmt.executeQuery("select id from artists where name='" + name + "'");
        return rs.next() ? rs.getInt(1) : null;
    }
}

И в методе Main, где я пытаюсь проверить это так:

public static void main(String[] args)
    {
        try {
            ArtistController artists = new ArtistController();
            AlbumController albums = new AlbumController();


            artists.create("Radiohead", "United Kingdom");
            artists.create("Phoenix", "Romania");
            Database.commit();


            int radioheadId = artists.findByName("Radiohead");
            System.out.println(radioheadId);

            albums.create(radioheadId,"OK COMPUTER", 1977);
            albums.create(radioheadId, "Kid A", 2000);
            albums.create(radioheadId, "In Rainbows", 2007);

            Database.commit();


            Database.closeConnection();
        } catch (SQLException e) {
            System.err.println(e);
            Database.rollback();
        }
    }

Я получаю исключение: java.sql.SQLException: Закрытый Resultset: следующий, хотя, как вы можете видеть, я не закрываю ни соединение, ни оператор перед rs, и я не понимаю, почему

1 Ответ

0 голосов
/ 29 апреля 2018

Ваш try-with-resources делает close ResultSet, но это не настоящая проблема. Вам нужно настроить Statement до того, как вы его выполните (и предпочитаете PreparedStatement и параметры привязки). Что-то вроде

public Integer findByName(String name) throws SQLException {
    String sql = "select id from artists where name=?";
    Connection con = Database.getConnection();
    try (PreparedStatement stmt = con.prepareStatement(sql)) {
        stmt.setString(1, name);
        try (ResultSet rs = stmt.executeQuery()) {
            return rs.next() ? rs.getInt(1) : null;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...