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
(поскольку по умолчанию используется только чтение).