Java:resultSet更新不更新数据库

时间:2016-10-13 16:34:24

标签: java sql database derby

我正在开发一个Java应用程序,主要是使用java数据库tutorial作为我自己的学习工具,由于某种原因,resultSet更新实际上并没有更新我的数据库。

有关项目的详细信息:我正在使用Netbeans IDE并使用5个表(每个表包含3到6列)连接到Derby数据库。数据库查看器窗口应该将所有记录加载到resultSet中,并将窗口中每个空白中的文本设置为那些存储的记录。此过程以及将光标移动到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);,看看它是否由于某种原因而没有默认,但两者都没有效果。 (作为参考,我使用了这个应用程序的早期版本,更紧密地使用了本教程,只使用了一个结果集和我的表中的一个,并且能够使更新按钮正常工作。)另外,我的预设语句将resultSet设置为TYPE_SCROLL_INSENSITIVECONCUR_UPDATABLE,我认为这是正确的选项。

链接到项目的github存储库:link。相关文件是MetrikaViewer.java,而不是DataManip.java,而自述文件(如果你碰巧需要更多信息,我没有给你或者像自我贬低的snark)是在主分支,这不是其余的代码是(Metrika分支)因为我使用git的一些问题(几乎100%的可能性是由我自己的愚蠢造成的)。

真的,作为一个非常新的Java学习者,如果这是由于某些奇怪的误解导致我的工作方式起作用,我会感到很惊讶,但经过一个星期的努力,我只能&#39似乎找不到它。

编辑:根据Axel,我在该方法中添加了updateRow。现在,更改在应用程序运行时更新,但它不会更新数据库。 (我相应地更新了上面的代码,github repo应该反映所做的更改。)

1 个答案:

答案 0 :(得分:1)

我从未使用过这些updateXXX()方法,但据我了解documentation,您必须在更新列后调用rs.updateRow()rs.insertRow()

此外,您必须确保使用ResultSet.CONCUR_UPDATABLE创建语句(因为默认情况下,使用只读)。