Почему rs.next () не идет на другую запись - PullRequest
0 голосов
/ 06 марта 2012

Если я удаляю beforeFirst(), моя функция делает только первую запись в ResultSet и переходит в конец. Если я использую beforeFirst(), я получаю ошибку ResultSet IS_TYPE_FORWARD_ONLY.

try {
    ResultSet rs = stat.executeQuery("select _id, godziny_id from tblZmiany where harmonogram_id = " + h_id + " order by pracownik_id, Dzien");
    rs.beforeFirst();
    while (rs.next()) {
        if (stat.executeUpdate("insert into tblWykonanie (Zmiana_id, Godziny_id) values ('" + rs.getLong(1) + "', " + rs.getInt(2) + ");") < 1) {
            // Jeśli insert nie wstawił kolejnego rekordu
            error_code = "Wystąpił problem podczas zatwierdzania harmonogramu.";
            return false;
        }
    }
} catch (SQLException e) {
    e.printStackTrace();
    System.out.println(e.getMessage());
    return false;
} catch (Exception e) {
    error_code = e.getMessage();
    return false;
}

return true;

Ответы [ 2 ]

3 голосов
/ 06 марта 2012

Вы используете один и тот же объект Statement для SELECT и INSERT. Из Javadoc :

Объект ResultSet автоматически закрывается, когда объект Statement, который его сгенерировал, закрывается, выполняется повторно или используется для получения следующего результата из последовательности нескольких результатов.

Чтобы устранить проблему, используйте отдельный объект Statement для вызова executeUpdate().

Кроме того, я настоятельно советую вам изменить код для использования PreparedStatement со связанными аргументами (представленными ?). Постепенное построение операторов SQL, как вы делаете сейчас, может открыть уязвимостей безопасности .

1 голос
/ 06 марта 2012

Ваш код имеет серьезный недостаток безопасности. Вы уязвимы для внедрения SQL. Никогда, никогда, никогда, никогда, никогда, никогда не используйте конкатенацию строк с операторами SQL; используйте вместо этого PreparedStatements!

 harmonogram_id = " + h_id + " order by pracownik_id,

Посмотрите здесь, чтобы увидеть, как легко можно использовать ваше приложение с помощью простых приемов: http://en.wikipedia.org/wiki/SQL_injection

Ответ на ваш вопрос зависит от вашей базы данных. Вы должны установить свойство при создании соединения:

Statement stmt = con.createStatement(
                           ResultSet.TYPE_SCROLL_SENSITIVE,
                           ResultSet.CONCUR_UPDATABLE),
                           ResultSet.HOLD_CURSORS_OVER_COMMIT);

От: http://docs.oracle.com/javase/1.4.2/docs/guide/jdbc/getstart/resultset.html#1012735

...