2016-09-15 101 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(); } 
    } 
}