Java: обновление resultSet не обновляет базу данных

Я разрабатываю Java-приложение, в основном как инструмент обучения для себя, используя учебник по java-базе данных, и по какой-то причине обновление resultSet фактически не обновляет мою базу данных.

Подробная информация о проекте: я использую IDE Netbeans и подключаюсь к базе данных Derby с 5 таблицами (каждая из которых содержит от 3 до 6 столбцов). Предполагается, что окно просмотра базы данных загружает все записи в resultSet и устанавливает текст в каждом пробеле в окне для этих сохраненных записей. Этот процесс и кнопки для перемещения курсора на First, Previous, Next и Last все работают отлично. Часть, над которой я сейчас работаю, - заставить кнопку "Обновить" получить текст в пробелах и соответственно обновить записи в базе данных.

Теперь к проблеме: записи не обновляются. Когда я запускаю проект и изменяю значение, затем нажимаю "Обновить", значение не возвращается к исходному значению или чему-либо еще (поскольку я не устанавливаю текст снова в методе updateButton), но когда я нажимаю "Далее", а затем предыдущий, текст возвращается к своему первоначальному значению. Кроме того, значения не обновляются, когда я закрываю приложение и запрашиваю записи в базе данных. Я также не получаю никаких исключений, и Netbeans говорит мне, что сборка прошла успешно.

Соответствующий код для метода обновления (и да, я знаю, что он, вероятно, неэффективен, но я пытаюсь заставить его работать до того, как сломаю его, пытаясь сделать его лучше):

private void btnUpdateRecordActionPerformed(java.awt.event.ActionEvent evt) {
    try {
        // get text from fields and convert to appropriate data type
        // in times
        String wakeTime = fieldWakeTime.getText();
        Time wakeTimeTm = java.sql.Time.valueOf(wakeTime);
        String outTime = fieldOutTime.getText();
        Time outTimeTm = java.sql.Time.valueOf(outTime);
        String inTime = fieldOutTime.getText();
        Time inTimeTm = java.sql.Time.valueOf(inTime);
        String sleepTime = fieldOutTime.getText();
        Time sleepTimeTm = java.sql.Time.valueOf(sleepTime);
        // in weights
        String morningPre = fieldPreWeight.getText();
        double morningPreDoub = Double.parseDouble(morningPre);
        String morningPost  = fieldPostWeight.getText();
        double morningPostDoub = Double.parseDouble(morningPost);
        String nightWeight = FieldNightWeight.getText();
        double nightWeightDoub = Double.parseDouble(nightWeight);
        // in meals
        String fullMeals = fieldFullMeals.getText();
        int fullMealsInt = Integer.parseInt(fullMeals);
        String snacks = fieldSnacks.getText();
        int snacksInt = Integer.parseInt(snacks);
        String sodas = fieldSodas.getText();
        int sodasInt = Integer.parseInt(sodas);
        String alcohol = fieldAlcohol.getText();
        double alcoholDoub = Double.parseDouble(alcohol);
        String desserts = fieldDesserts.getText();
        int dessertsInt = Integer.parseInt(desserts);
        // in ratings
        String morningMood = fieldMorningMood.getText();
        double morningMoodDoub = Double.parseDouble(morningMood);
        String nightMood = fieldNightMood.getText();
        double nightMoodDoub = Double.parseDouble(nightMood);
        String activityRating = fieldActivityRating.getText();
        double activityRatingDoub = Double.parseDouble(activityRating);

        // uses rs's to update db columns
        // in times
        rsTimes.updateTime("WAKE_TIME", wakeTimeTm);
        rsTimes.updateTime("OUT_TIME", outTimeTm);
        rsTimes.updateTime("IN_TIME", inTimeTm);
        rsTimes.updateTime("SLEEP_TIME", sleepTimeTm);
        // in weights
        rsWeights.updateDouble("MORNING_PRE", morningPreDoub);
        rsWeights.updateDouble("MORNING_POST", morningPostDoub);
        rsWeights.updateDouble("NIGHT_WEIGHT", nightWeightDoub);
        // in meals
        rsMeals.updateInt("FULL_MEALS", fullMealsInt);
        rsMeals.updateInt("SNACKS", snacksInt);
        rsMeals.updateInt("SODAS", sodasInt);
        rsMeals.updateDouble("ALCOHOL", alcoholDoub);
        rsMeals.updateInt("DESSERTS", dessertsInt);
        // in ratings
        rsRatings.updateDouble("MORNING_MOOD", morningMoodDoub);
        rsRatings.updateDouble("NIGHT_MOOD", nightMoodDoub);
        rsRatings.updateDouble("ACTIVITY_RATING", activityRatingDoub);

        // updates rows
        rsTimes.updateRow();
        rsRatings.updateRow();
        rsWeights.updateRow();
        rsMeals.updateRow();

    } catch (SQLException err) {
        JOptionPane.showMessageDialog(this, err.getMessage());
    }
}

При поиске решений этой проблемы я натолкнулся на множество вариантов предложений con.setAutoCommit(false); а затем зафиксировать изменения в конце блока метода, который я пробовал, а также явно con.setAutoCommit(true); чтобы увидеть, не было ли это по умолчанию по какой-то причине, ни одна из которых не сработала. (Для справки, я сделал более раннюю версию этого приложения, используя, более внимательно следуя руководству и используя только 1 из resultSet's и 1 из моих таблиц, и смог заставить работать кнопку обновления.) Кроме того, мои подготовленные операторы имеют resultSet установлен в TYPE_SCROLL_INSENSITIVE а также CONCUR_UPDATABLE, который я считаю правильными вариантами.

Ссылка на github репозиторий проекта: ссылка. Соответствующий файл - MetrikaViewer.java, а не DataManip.java, и файл README (если вам понадобилась дополнительная информация, которую я вам не предоставил, или как самоуничижительный snark) находится в основной ветке, а не там, где остальные код (ветка Metrika) из-за некоторых проблем, с которыми я столкнулся при использовании git (с почти 100% вероятностью быть вызванным моей собственной глупостью).

На самом деле, будучи еще совсем новым учеником по Java, я совсем не удивился бы, если бы это было вызвано каким-то странным непониманием того, как что-то работает с моей стороны, но после недели чесания головы я просто не могу найти Это.

Редактировать: Согласно Акселю, я добавил updateRow в метод. Теперь изменения обновляются в приложении во время работы, но не обновляют базу данных. (Я обновил код выше, соответственно, и репозиторий github должен отражать сделанные изменения.)

1 ответ

Я никогда не использовал эти updateXXX() методы, но, как я понимаю документацию, вы должны сделать вызов rs.updateRow() или же rs.insertRow() после обновления столбцов.

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

Другие вопросы по тегам