Java:SQL查询:更新列后rs.next()为false

时间:2016-09-15 18:14:58

标签: java sql

我有一个奇怪的问题。我有一个数据库,我想更改列的值。这些值在Arraylist(时间表)中保护。

为了在右行写入值,我有第二个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循环在第一次通过后不会继续,但结束。

2 个答案:

答案 0 :(得分: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 ..."));
}

答案 1 :(得分:0)

至于 为什么 它会发生:

以下是官方documentation的解释:

  

当生成它的Statement对象关闭,重新执行或用于从多个结果序列中检索下一个结果时,ResultSet对象会自动关闭。

替代方法:

从您的示例中,您似乎正在尝试更新"相同"在resultSet中的行,您应该考虑使用Updatable 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(); }
    }
}