JDBC ResultSet закрытое заявление - PullRequest
0 голосов
/ 16 мая 2011

Я пытаюсь написать функцию, которая обновляет 2 таблицы в моей базе данных.Я получаю сообщение об ошибке, вызванное вызовом next () для набора результатов, в котором больше нет строк.Я думал, что условие if в hasNext () исправит это, но оно не будет доступно для результирующего набора ...

Ошибка, которую я получаю, - «Операции запрещены после закрытия оператора.»

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();
        }
    }

Ответы [ 2 ]

1 голос
/ 16 мая 2011

Вы можете иметь только одно открытое заявление на соединение.Как только вы создадите новый оператор на том же соединении, ранее созданное будет закрыто

Это верно для результирующего набора, что у нас может быть только один открытый результирующий набор для каждого оператора.При наличии соединения мы можем открыть несколько операторов.

1 голос
/ 16 мая 2011

Если вы не используете пакеты (addBatch() / executeBatch()) и не очищаете параметры (clearParameters()), тогда вы должны создавать операторы внутри цикла, а не вне цикла.

Переместите обе строки conn.prepareStatement() в блок if (newMovie == true && localMovie.getTitle() != null), предпочтительно с рефакторингом отдельными методами. Ваш текущий метод делает слишком много.

...