2016-09-15 48 views
2

我有一個奇怪的問題。我有一個數據庫,我想改變一列的值。這些值在Arraylist(時間列表)中被保存。Java:SQL查詢:更新列後rs.next()爲false

爲了在正確的行寫入值,我有第二個Arrylist(名單)。所以我想閱讀我的數據庫中的第一行,而不是查看名稱列表並找到名稱。比我從時間列表中取出匹配值並將其寫入數據庫到行中的「following_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

AHA非常interersting,我不知道。我會試試這個。謝謝:) – aragonthebest

+0

是的,它現在的作品。是否有可能同時宣佈2個國家的分離變量? – 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(); } 
    } 
}