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_INSENSITIVECONCUR_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创建声明(因为默认情况下只使用只读)。

+0

谢谢。我忘记了updateRow调用。现在更改正在运行的应用程序内更新,但不更新数据库内。(我编辑了原始文章以反映更改。) – Grimmslaw

+0

现在确保在上次调用updateRow()后调用'commit()'以使更改持久化。 – Axel

+0

确实如此,谢谢;我忘了返回并添加'commit()',一旦我将autoCommit改回false。谢谢一堆。出于好奇,autoCommit有什么问题?在研究我遇到的问题时,我看到相当多的人说要始终将其设置为假。如果每个人似乎都说要禁用它,它的目的是什么? – Grimmslaw