Java:resultSet更新不会更新数据库
我正在开发一个Java应用程序,作为我自己的学习工具,主要使用java数据库tutorial,出于某种原因,resultSet更新实际上并未更新我的数据库。Java:resultSet更新不会更新数据库
有关该项目的详细信息:我正在使用Netbeans IDE并连接到具有5个表格(每个具有3到6列)的Derby数据库。数据库查看器窗口应该将所有记录加载到结果集中,并将窗口中每个空白中的文本设置为存储的记录。这个过程和将光标移动到First,Previous,Next和Last的按钮都可以完美地工作。我目前正在使用的部分是使Update按钮获得空白中的文本并相应地更新数据库中的记录。
现在的问题:记录不更新。当我运行该项目并更改一个值,然后按更新,该值不会恢复到原始值或任何东西(因为我没有再次在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和1个表,并且能够更新按钮。)另外,我准备好的语句具有resultSet的设置为TYPE_SCROLL_INSENSITIVE
和CONCUR_UPDATABLE
,我相信这是正确的选项。
链接到该项目的github存储库:link。相关的文件是MetrikaViewer.java,而不是DataManip.java,并且README(如果您碰巧需要更多的信息,我没有给你或像自嘲snark)是在主分支,这是不是其余的代码是(Metrika分支),因为我使用了git的一些问题(由于我自己的愚蠢导致几乎100%的机会)。
真的,作为一名仍然非常新的Java学习者,如果这是由于我对某件事情有些奇怪的误解而引起的,我一点也不会感到惊讶,但是在一个星期的抓挠之后,我只能'似乎找不到它。
编辑:根据Axel,我添加了updateRow的方法。现在,运行时应用程序内的更新会更新,但不会更新数据库。 (我已经更新上面的代码,因此,和GitHub库应反映所做的更改。)
我从来没有用过这些updateXXX()
方法,但据我所知,documentation,你必须发出要么rs.updateRow()
通话或更新列后rs.insertRow()
。
此外,您必须确保使用ResultSet.CONCUR_UPDATABLE
创建声明(因为默认情况下只使用只读)。
谢谢。我忘记了updateRow调用。现在更改正在运行的应用程序内更新,但不更新数据库内。(我编辑了原始文章以反映更改。) – Grimmslaw
现在确保在上次调用updateRow()后调用'commit()'以使更改持久化。 – Axel
确实如此,谢谢;我忘了返回并添加'commit()',一旦我将autoCommit改回false。谢谢一堆。出于好奇,autoCommit有什么问题?在研究我遇到的问题时,我看到相当多的人说要始终将其设置为假。如果每个人似乎都说要禁用它,它的目的是什么? – Grimmslaw