ошибка при executeQuery()

420
03 августа 2017, 23:51
while (true) {
            resultset = statement.executeQuery(query);
            int count = 0;
            while (resultset.next()) {
                count = resultset.getInt(1);
            }
            if (count > curId) {
                System.out.println("UPDATE");
                String query1 = "SELECT * FROM `db` WHERE id = " + count;
                resultset = statement.executeQuery(query1);
                // проверка шаг 1 или 2
                // Дальше только при шаге 2
                int status = 100;
                String query2 = "INSERT INTO help (id, status) VALUES (" + count + ", " + status + ")";
                statement.executeUpdate(query2);
                curId = count;
            }
            String query3 = "SELECT * FROM help WHERE status = 400";
            testResultset = statement.executeQuery(query3);
            while (testResultset.next()) { // здесь возникает ошибка после удаления
                int id = testResultset.getInt(1);
                String query_delete = "DELETE FROM help WHERE id = " + id ;
                statement.executeUpdate(query_delete);
            }
            Thread.sleep(100);
        }

Цикл крутиться нормально, но после удаления одного элемента возникает ошибка

java.sql.SQLException: Operation not allowed after ResultSet closed
Answer 1

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

http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html

By default, only one ResultSet object per Statement object can be open at the same time. Therefore, if the reading of one ResultSet object is interleaved with the reading of another, each must have been generated by different Statement objects. All execution methods in the Statement interface implicitly close a statment's current ResultSet object if an open one exists.

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

Если коротко, то у вас есть несколько ResultSet, относящихся к тому же самому объекту Statement одновременно. И вы его не закрываете.

Вы можете создать другой Statement объект для удаления записи в БД. либо же закрыть RS

READ ALSO
передать bundle из Actvity в Fragment

передать bundle из Actvity в Fragment

Есть Activity и bundle

246
Как правильно задать коннект к БД

Как правильно задать коннект к БД

Создаю web-приложение на Spring MVC + Hipernate + MySQL

351
Ошибка java.lang.NoSuchFieldError: RETURN_NULL_AND_BLANK

Ошибка java.lang.NoSuchFieldError: RETURN_NULL_AND_BLANK

Создан класс для экспорта данных Jtable в Excel При выполнении возникает ошибка

582
java.lang.NullPointerException Google Calendar API Quickstart

java.lang.NullPointerException Google Calendar API Quickstart

Решил тестировать пример Google Calendar API Quickstart по этой ссылке https://developersgoogle

347