2016-06-16 2 views
0

현재 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 

답변

2

왜 SELECT, LOOP와

String deleteSQL= "DELETE FROM table WHERE end <= (NOW() - INTERVAL 1 HOUR)"; 
Statement deleteStatement = conn.createStatement(); 
deleteStatement.executeUpdate(deleteSQL); 

가보다 효율적으로 작업 할 때 삭제는

+0

더 이해가됩니다. 삭제 된 항목의 수를 얻기 위해 루프를 수행하고있었습니다. 당신은 그 성명서에서 그것을 돌려 줄 수 있습니까? – user081608

+0

예, 반환 값은 https://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#executeUpdate(java.lang.String) –

+0

에서 확인하십시오. 반환되었습니다. – user081608

1

, 다음 ResultSet rs가 자동으로 closed입니다 단순히 레코드를 선택하고 각각을 삭제하는 대신

String deleteCmd = "DELETE FROM table WHERE end <= (NOW() - INTERVAL 1 HOUR)"; 
int deletedCount = deleteStatement.executeUpdate(deleteCmd); 

대신에 실행하면됩니다.

0

나는 결과 집합에 반복하고 논리가 완전히 잘못 동안 당신이 행을 삭제하기 때문에 이런 일이 생각합니다. "< 끝 = (NOW() - INTERVAL 1 HOUR)")으로 모든 ID를 선택한 다음 나중에 삭제하십시오. 처음부터 모두 삭제하지 않으시겠습니까? 이런 식으로 "테이블 끝에서 삭제 < = (NOW() - INTERVAL 1 HOUR)". select 문에서 count를 먼저 가져와 delete 쿼리로 가져와야하는 경우.

관련 문제