java.sql.sqlRecoverableException: оператор Closed: следующий

Мой код выдает

java.sql.sqlRecoverableException: Sentencia cerrada: next

что, на английском языке, я думаю, это будет:

java.sql.sqlRecoverableException: Closed statement: next

Это мой код:

public TransactionArray() throws SQLException {

  /* Obtenemos la tabla de transacciones. */
  Connection connection;
  connection = ConnectionManager.getConnection(STATISTIC_DATA_BASE);
  Statement stmt = null;
  String query =
          "select * " +
          "from " + "dCellStatistic" + ".F_Transaction";
  ResultSet rs = null;
  try {
     stmt = connection.createStatement();
     rs = stmt.executeQuery(query);
  } catch (SQLException e ) {
     e.printStackTrace();
  } finally {
     if (stmt != null) { stmt.close(); }
  }

  /* Construimos las transacciones a partir de los registros. */
  List<Transaction> transactionList = new ArrayList<Transaction>();
  while (rs.next()) { //THE PROBLEM ARISES IN THIS LINE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     transactionList.add(new Transaction(rs));
  }
  array = transactionList.toArray(new Transaction[transactionList.size()]);

}

Любые подсказки о том, что я могу делать неправильно? Я видел две темы на Code Ranch о похожих проблемах, но ни одна из них, похоже, не дала решения для моего случая.


person Josep    schedule 19.02.2013    source источник


Ответы (2)


Вы закрываете инструкцию до извлечения информации из набора результатов. Переместите вызов stmt.close() после цикла rs.next() (но сохраните попытку/наконец).

person Eric Galluzzo    schedule 19.02.2013
comment
Оно работает! Но зачем мне сохранять блок finally, если он больше не содержит никакого оператора? - person Josep; 19.02.2013
comment
Вы должны поместить rs.next() в основной блок try, а затем в блок finally оставить stmt.close(). - person Eric Galluzzo; 19.02.2013

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

public TransactionArray() throws SQLException {
  List<Transaction> transactionList = new ArrayList<Transaction>();

  /* Obtenemos la tabla de transacciones. */
  Connection connection;
  connection = ConnectionManager.getConnection(STATISTIC_DATA_BASE);
  Statement stmt = null;
  String query =
          "select * " +
          "from " + "dCellStatistic" + ".F_Transaction";

  /* Construimos las transacciones a partir de los registros. */
  ResultSet rs;
  try {
     stmt = connection.createStatement();
     rs = stmt.executeQuery(query);
     while (rs.next()) {
        transactionList.add(new Transaction(rs));
     }
  } catch (SQLException e ) {
     e.printStackTrace();
  } finally {
     if (stmt != null) {
        stmt.close();
     }
  }
  array = transactionList.toArray(new Transaction[transactionList.size()]);
}
person Josep    schedule 19.02.2013