我有一个奇怪的问题。我有一个数据库,我想更改列的值。这些值在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循环在第一次通过后不会继续,但结束。
答案 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(); }
}
}