2016-09-15 6 views
2

私は奇妙な問題があります。データベースがあり、列の値を変更したい。値はArraylist(タイムリスト)で保護されています。Java:SQLクエリ:列を更新した後、rs.next()がfalseになる

右の行に値を書き込むために、私は2番目のArrylist(ネームリスト)を持っています。だから私は、ネームリストをチェックして名前を見つけるよりも、データベースの最初の行を読みたいと思っています。タイムリーリストから一致する値を取り出し、それをデータベースの列の "follows_date"列に書き込みます。

より多くのエントリがなくなるまで、私はデータベースの次の行を読みました。

奇妙なことに、データベースで何も変更しないと、while(rs.next())の部分が動作します。例えば

ResultSet rs = statement.executeQuery("SELECT username FROM users"); 
     while(rs.next()){ 

      // read the result set 
      String name = rs.getString("username"); 
      System.out.println("username = " + name); //liest die namen 
      } 
     } 

これは名前の後に私のすべての名前を印刷します。しかし、テーブルを変更すると、その後whileループが終了します。 (エラーは、プログラムがちょうど終了していない)

ResultSet rs = statement.executeQuery("SELECT username FROM users"); 
     while(rs.next()){ 

      // read the result set 
      String name = rs.getString("username"); 
      System.out.println("username = " + name); //writes the name 

     //look, if name is in Arraylist "namelist"). if yes, than write the matching date from "timelist" into the database. 
      if (namelist.contains(name)){ 
       System.out.println("name found: "+ name); 
       int listIndizi = namelist.indexOf(name); //get index 
       Long indiziDatum = (long) timelist.get(listIndizi); //get date from same Index 
       System.out.println(indiziDatum); // print date so i can see it is correct (which it is) 

       statement.executeUpdate("UPDATE users SET follows_date ="+ indiziDatum +" WHERE username = '"+name+"'"); //updates the follows_date column 

      } 
     } 

すべては今ことを除いて、正常に動作し、whileループは最初の継代後も継続しませんが、終了します。

答えて

1

文のresultSetは閉じられており、別の文を実行すると結果は返されません。更新用に新しい個別の文オブジェクトを作成し、すべてが例外として機能するはずです。 なぜについては

Statement statement1 = connection.createStatement(); 
Statement statement2 = connection.createStatement(); 

ResultSet resultSet1 = statement1.executeQuery("SELECT username FROM users"); 
while(resultSet1.next()){ 
... 
    statement2.executeUpdate("UPDATE users ...")); 
} 
+0

非常にintererstingなるほど、私は知りませんでした。私はこれを試してみる。ありがとう:) – aragonthebest

+0

はいそれは今動作します。 2人のstatemantsを別々の変数に同時に宣言することは可能ですか? – aragonthebest

+0

私は疑問に思っていませんか?あなたは好きなだけ多くのステートメントオブジェクトを持つことができます。疑問のあるコードを投稿できますか?そして、答えを受け入れることを忘れないでください:-) – Guenther

0

それが起こる:

をここに公式documentationからの説明です:

それを生成したStatementオブジェクトがあるときにResultSetオブジェクトが自動的にクローズされます複数の結果のシーケンスから次の結果を取得するために使用されます。

代替アプローチ:

あなたのサンプルから、それはあなたがあなたの結果セットの「同じ」行を更新しようとしているようだ、あなたは更新可能なResultSetを使用して検討すべきです。公式documentationから

サンプルコード:

public void modifyPrices(float percentage) throws SQLException { 

    Statement stmt = null; 
    try { 
     stmt = con.createStatement(); 
     stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, 
        ResultSet.CONCUR_UPDATABLE); 
     ResultSet uprs = stmt.executeQuery(
      "SELECT * FROM " + dbName + ".COFFEES"); 

     while (uprs.next()) { 
      float f = uprs.getFloat("PRICE"); 
      uprs.updateFloat("PRICE", f * percentage); 
      uprs.updateRow(); 
     } 

    } catch (SQLException e) { 
     JDBCTutorialUtilities.printSQLException(e); 
    } finally { 
     if (stmt != null) { stmt.close(); } 
    } 
} 
関連する問題