2016-06-16 11 views
0

現在、JDBCを使用してデータベースからアイテムを削除しようとしていますが、どうしても逃げる方法が見つからないというエラーが発生しています。エラーは次のとおりです。ここでデータベースからの削除時にResultSetが終了した後に操作が許可されない

Caused by: java.sql.SQLException: Operation not allowed after ResultSet closed 

はJavaで、私はここでやっている何

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文を作成する必要がありますか?私はこれを正しく行う方法を考え出すことができません。ここで

は完全なエラーです:

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

がより効率的に働くとき、DELETEは

+0

これは理にかなっています。私は、削除されたアイテムの数を得るためにループを行っていました。あなたはその声明からちょうどそれを返せますか? – user081608

+0

はい、戻り値はhttps://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#executeUpdate(java.lang.String) –

+0

からご覧ください。パーフェクト、それを知らなかった戻ってきた。 – user081608

1

ライン

deleteStatement.executeUpdate(deleteSQL); 

が実行されると、その後、ResultSet rsが自動的closedです:

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.


しかし、あなたはそうすることができますレコードを選択して削除するのではなく、実行するだけでこれを実行してください。

0

私は、結果セットにループして、あなたのロジックは完全に間違っている間、あなたが行を削除するので、これが起こっていると思います。 「< =(NOW() - INTERVAL 1 HOUR)」末尾のすべてのidsを選択した後、削除してください。最初にすべてを削除してみませんか?このように "どこからテーブルから削除< =(NOW() - INTERVAL 1 HOUR)"。最初にselectステートメントにカウントを取得する必要がある場合は、削除クエリを実行します。

関連する問題