Набор результатов не открыт. Убедитесь, что autocommit выключен [дубликат]

и для пользователя Mac OS вы можете использовать Network Link Conditioner, который можно загрузить из Apple. установите его как AP на Mac, и любые его разделы могут подключаться.

вы можете использовать функции open source с помощью facebook ATC http://facebook.github.io/augmented-traffic-control/ [ ! d0]

2
задан manouti 28 April 2015 в 17:34
поделиться

1 ответ

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

Пример:

Statement stmt = conn.createStatement();
Statement stmt1 = conn.createStatement();
...
ResultSet res = stmt.executeQuery(Query);

...

while(res.next()){

     S_Code = res.getString("S_Code");
     Query1 = "SELECT * From Subjects WHERE Prerequisite = '"+S_Code+"'";
     res1 = stmt1.executeQuery(Query1); // use a separate statement

    while(res1.next()){

        DLM.addElement(res.getString("S_Code"));
    }

}

Это объясняется в следующей цитате из Statement API docs :

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

Также настоятельно рекомендуется закрыть ресурсы JDBC в файле обратный порядок их размещения, т. е. вы должны закрыть Statement, затем закройте Connection, и вы должны сделать это в блоке finally:

catch(SQLException e){
    JOptionPane.showMessageDialog(null, e.toString());
} finally {
    if(res != null) {
        res.close();
    }
    if(res1 != null) {
        res1.close();
    }
    if(stmt != null) {
        stmt.close();
    }
    if(stmt1 != null) {
        stmt1.close();
    }
    if(conn != null) {
         conn.close();
    }
}

re, используя Java 7, вы можете использовать оператор try-with-resources для автоматического закрытия этих ресурсов (без явного вызова метода close()):

// try-with-resources statement declaring two resources
try(Connection conn  = DriverManager.getConnection(url,username,password);
    Statement stmt = conn.createStatement()) {
    ...
} catch(SQLException e){
    JOptionPane.showMessageDialog(null, e.toString());
}

Попробуемые ресурсы будут не забудьте закрыть объект Statement, затем Connection после их использования.

7
ответ дан manouti 17 August 2018 в 10:25
поделиться
  • 1
    Для последней части вашего ответа лучше использовать try-with-resource: он гарантирует закрытие в правильном порядке, даже если происходят исключения (например, если исключение выбрано в вашем примере finally block, тогда соединение может не быть закрыться). – Mark Rotteveel 28 April 2015 в 18:38
  • 2
    Также рекомендуется использовать PreparedStatement, чтобы OP не попадал в проблемы с кодами курсов, такими как '; DROP TABLE Students; -- :) – Mick Mnemonic 28 April 2015 в 20:23
  • 3
    Спасибо, миллион парней. опыт с ресурсами отлично работал: D – Kenchi 28 April 2015 в 20:32
  • 4
    и, кстати, я понятия не имею, что такое PreparedStatement и как оно используется. Я все еще новичок в этом, поэтому у меня нет нулевого знания. – Kenchi 28 April 2015 в 20:34
  • 5
    Учебник Oracle в PreparedStatement s дает хороший обзор. Короче говоря, вы хотите использовать их каждый раз, когда вы передаете переменные в ваш SQL, чтобы избежать SQL injection и включить БД для повторного использования ваших запросов. – Mick Mnemonic 28 April 2015 в 21:09
Другие вопросы по тегам:

Похожие вопросы: