2013-02-19 30 views
8

Mã của tôi némjava.sql.sqlRecoverableException: Đóng cửa tuyên bố: tiếp theo

java.sql.sqlRecoverableException: Sentencia cerrada: next 

đó, bằng tiếng Anh, tôi đoán nó sẽ là:

java.sql.sqlRecoverableException: Closed statement: next 

Đây là mã của tôi:

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()]); 

}

Bất kỳ manh mối nào về những gì tôi có thể làm ing sai? Tôi đã thấy hai chủ đề trên Code Ranch về các vấn đề tương tự, nhưng không ai trong số họ dường như cung cấp một giải pháp cho trường hợp của tôi.

+0

Tiếng Anh của bạn khá tốt nhưng tại sao mã bằng tiếng Tây Ban Nha? :) – adarshr

+3

Xem câu trả lời từ @EricGalluzzo bên dưới. Để tham khảo trong tương lai, hành vi này được ghi lại trong [Javadoc] (http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html) - 'Một đối tượng ResultSet được tự động đóng lại khi Đối tượng tuyên bố tạo ra nó được đóng lại, được thực hiện lại hoặc được sử dụng để truy xuất kết quả tiếp theo từ một chuỗi nhiều kết quả.'. – Perception

+1

@adarshr Cảm ơn lời khen. Tôi là người Tây Ban Nha và tôi làm việc ở Tây Ban Nha. Chúng tôi thường viết bình luận bằng ngôn ngữ của nước ta. – Josep

Trả lời

17

Bạn đang đóng tuyên bố trước khi truy xuất thông tin từ tập hợp kết quả. Di chuyển cuộc gọi stmt.close() sau vòng lặp rs.next() (nhưng vẫn giữ thử/cuối cùng).

+0

Nó hoạt động! Nhưng tại sao tôi nên giữ "cuối cùng" khối nếu nó không còn chứa bất kỳ tuyên bố? – Josep

+2

Bạn nên đặt 'rs.next()' bên trong khối thử chính, và sau đó trong khối cuối cùng, giữ 'stmt.close()'. –

2

Vì mã cố định không phù hợp trong nhận xét, tôi xuất bản nó ở đây để tham khảo trong tương lai.

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()]); 
}