我正在尝试编写一个函数来更新数据库中的 2 个表。我收到一个错误,我认为这是由于在结果集中调用 next() 引起的,而该结果集中没有更多行。 我认为 hasNext() 上的 if 条件可以解决此问题,但它不适用于结果集...
我收到的错误是“语句关闭后不允许执行任何操作。”
private void updateDatabase() throws Exception {
Connection conn = getConnection();
PreparedStatement updateMovieStmt = conn.prepareStatement("INSERT INTO movies VALUES(null,?,null,null,null)", Statement.RETURN_GENERATED_KEYS);
PreparedStatement updateVideoStmt = conn.prepareStatement("INSERT INTO video_files VALUES(null,null,null,?,?)", Statement.RETURN_GENERATED_KEYS);
try {
for (Movie localMovie : getLocalMovies()) {
// fetch a local movie{
boolean newMovie = true;
for (Movie dbMovie : getDatabaseMovies(conn)) {
newMovie = true;
Pattern p = Pattern.compile(localMovie.getTitlePattern(), Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(dbMovie.getTitle());
// if it's already in the database not new movie... but is
// is it a new video rip????????????;
if (m.find()) {
System.out.println("DB movie: " + dbMovie.getTitle() + " matches localpattern of: " + localMovie.getTitlePattern());
newMovie = false;
break;
}
}
if (newMovie == true && localMovie.getTitle() != null) {
updateMovieStmt.setString(1, localMovie.getTitle());
updateMovieStmt.executeUpdate();
// get new movie id and put into new video row
ResultSet rs = updateMovieStmt.getGeneratedKeys();
if (rs.next()) {
updateVideoStmt.setBytes(1, localMovie.getHash());
updateVideoStmt.setInt(2, rs.getInt(1));
updateVideoStmt.executeUpdate();
}
}
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
updateMovieStmt.close();
updateVideoStmt.close();
conn.close();
}
}
最佳答案
如果您不使用批处理 (addBatch()
/executeBatch()
),也不清除参数 (clearParameters()
) ,那么您应该在循环内部创建语句,而不是在循环外部。
将两行 conn.prepareStatement()
行移至 if (newMovie == true && localMovie.getTitle() != null)
block 中,最好单独重构方法。您当前的方法做得太多了。
关于java - JDBC ResultSet 关闭语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6011924/