使用executeUpdate解决ResultSet问题

时间:2018-04-06 15:47:24

标签: java resultset multiple-resultsets

我是编程新手,在使用带有resultSet next()方法的executeUpdate时遇到了问题。 它仅通过结果集迭代一次,然后执行更新关闭结果集。我收到错误:ResultSet未打开。操作"下一步"不允许。验证自动提交是否已关闭。 我添加了con.setAutoCommit(false)语句,但问题仍然存在。 我需要使用不同的变量值多次运行更新。 这是我的代码:

    try {
        String eidQuery = "SELECT EID FROM EMPLOYEE_DATA WHERE ACTIVE = TRUE ORDER BY EID";
        int nextEID;
        Statement st = con.createStatement();
        con.setAutoCommit(false);
        rs = st.executeQuery(eidQuery);
        while (rs.next()){
            nextEID = rs.getInt(1);
            String getDailyTotals = "SELECT DATE, SUM(TOTAL), MAX(OUT_1) FROM PUNCHES WHERE EID = " + nextEID + " AND DATE >= '" + fd + "' "
                    + "AND DATE <= '" + td + "' GROUP BY DATE";

            ResultSet rs2 = st.executeQuery(getDailyTotals);
            while (rs2.next()){
                double dailyTotal = rs2.getDouble(2);
                if (dailyTotal > 8){
                    double dailyOT = dailyTotal-8;
                String dailyDate = rs2.getDate(1).toString();
                Timestamp maxTime = rs2.getTimestamp(3);
                String updateOT = "UPDATE PUNCHES SET OT = " + dailyOT + " WHERE EID = " + nextEID + " AND DATE = '" + dailyDate + "' AND OUT_1 = '" + maxTime + "'";

                st.executeUpdate(updateOT);

            }
            }
        }

        rs = st.executeQuery("SELECT PUNCHES.EID, EMPLOYEE_DATA.FIRST_NAME, EMPLOYEE_DATA.LAST_NAME, SUM(PUNCHES.OT) FROM PUNCHES "
                + "JOIN EMPLOYEE_DATA ON PUNCHES.EID = EMPLOYEE_DATA.EID WHERE PUNCHES.DATE >= '" + fd + "' AND PUNCHES.DATE <= '" + td + "' GROUP BY EMPLOYEE_DATA.FIRST_NAME, EMPLOYEE_DATA.LAST_NAME, PUNCHES.EID");

        Reports.setModel(DbUtils.resultSetToTableModel(rs));

    } catch (SQLException ex) {
        Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
        JOptionPane.showMessageDialog(null, ex);
    }

3 个答案:

答案 0 :(得分:2)

你是编程和(显然)Java的新手。以下是我可以为您提供的一些建议:

  1. 帮自己一个忙,了解PreparedStatement。您不应该通过连接Strings来创建SQL。
  2. 您正在将混合数据库和UI Swing代码的经典新手犯罪归为单个,难以调试的块。最好将您的应用分解为多个层次。从封装所有数据库代码的数据访问接口开始。进行测试并为您的UI提供实例。
  3. 不要在循环内部对ResultSet中的更新查询进行交错。最好将两者完全分开。
  4. 了解MVC。您希望Swing View与app Controller分开。让Controller与数据访问接口交互,获取结果,并将结果提供给View以供显示。让它们分离并分开。
  5. 了解JUnit。它可以帮助您进行测试。

答案 1 :(得分:2)

来自java.sql.ResultSet javadoc:

  

当Statement对象时,ResultSet对象自动关闭   生成它的是关闭,重新执行或用于检索下一个   由多个结果序列产生。

执行更新后,将关闭先前的ResultSet。您需要重新编写代码以解决此问题。 https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html

最简单的返工方式可能是使用两个语句,一个用于查询,另一个用于更新,但正如duffymo的回答中所述,你可以做更多的事情来改进。

答案 2 :(得分:0)

来自API的声明文档&#34;默认情况下,每个Statement对象只能同时打开一个ResultSet对象。因此,如果一个ResultSet对象的读取与另一个ResultSet对象的读取交错,则每个ResultSet对象必须由不同的Statement对象生成,并且#34;

如果要在同一嵌套循环中读取两个不同的ResultSet,则需要两个不同的语句。