현재 JDBC를 사용하여 데이터베이스에서 항목을 삭제하려고하지만 멀리 벗어나는 방법을 찾을 수 없다는 오류가 발생합니다. 오류 : 여기 데이터베이스에서 삭제할 때 ResultSet이 닫힌 후에 작업이 허용되지 않습니다.
Caused by: java.sql.SQLException: Operation not allowed after ResultSet closed
은 자바이다 :
System.out.println("Connecting database for Delete...");
Integer deletedCount = 0;
Statement deleteStatement = null;
try (Connection conn = DriverManager.getConnection(url, username, password)) {
System.out.println("Database connected!");
deleteStatement = conn.createStatement();
String selectDelete = "SELECT id FROM table WHERE end <= (NOW() - INTERVAL 1 HOUR)";
ResultSet rs = deleteStatement.executeQuery(selectDelete);
while (rs.next()) {
String eventid = rs.getString("id");
String deleteSQL = "DELETE FROM table WHERE id = " + eventid;
deleteStatement.executeUpdate(deleteSQL);
deletedCount++;
System.out.println(deletedCount);
}
System.out.println("Completed Delete! "+ deletedCount +" deleted!");
} catch (SQLException e) {
throw new IllegalStateException("Cannot connect the database!", e);
}
내가 여기서 뭐하는 거지하는 첫 번째 날짜가 이미 지난 모든 항목을 선택하고 결과 세트로 설정됩니다. 그런 다음 데이터베이스에서 삭제하기 위해 while 루프를 반복합니다. 그것은 한 번 실행하고 나는 아래에 완전히 넣을 오류가 발생합니다. 루프를 돌 때마다 새로운 delete 문을 만들어야합니까? 나는 이것을 올바르게 할 수있는 방법을 생각할 수 없다. 여기
전체 오류입니다 :A ResultSet object is automatically closed when the Statement object that generated it is closed, re-executed, or used to retrieve the next result from a sequence of multiple results.
하지만 당신은 그렇게 할 수 있습니다 라인
deleteStatement.executeUpdate(deleteSQL);
가 실행
Connecting database for Delete...
Database connected!
1
Exception in thread "main" java.lang.IllegalStateException: Cannot connect the database!
at JDBC.deleteOverDueEvents(JDBC.java:56)
at EventJSON.main(EventJSON.java:31)
Caused by: java.sql.SQLException: Operation not allowed after ResultSet closed
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:963)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:896)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:885)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:743)
at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:6313)
at JDBC.deleteOverDueEvents(JDBC.java:45)
... 1 more
더 이해가됩니다. 삭제 된 항목의 수를 얻기 위해 루프를 수행하고있었습니다. 당신은 그 성명서에서 그것을 돌려 줄 수 있습니까? – user081608
예, 반환 값은 https://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#executeUpdate(java.lang.String) –
에서 확인하십시오. 반환되었습니다. – user081608