Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用executeUpdate的结果集出现问题_Java_Resultset_Multiple Resultsets - Fatal编程技术网

Java 使用executeUpdate的结果集出现问题

Java 使用executeUpdate的结果集出现问题,java,resultset,multiple-resultsets,Java,Resultset,Multiple Resultsets,我是编程新手,在使用带有resultSet next()方法的executeUpdate时遇到了一个问题。 它只在结果集中迭代一次,然后执行更新关闭结果集。我得到错误:结果集未打开。不允许操作“下一步”。确认自动提交已关闭。 我已经添加了con.setAutoCommit(false)语句,但问题仍然存在。 我需要使用不同的变量值多次运行更新。 以下是我的代码: try { String eidQuery = "SELECT EID FROM EMPLOYEE_DATA

我是编程新手,在使用带有resultSet next()方法的executeUpdate时遇到了一个问题。 它只在结果集中迭代一次,然后执行更新关闭结果集。我得到错误:结果集未打开。不允许操作“下一步”。确认自动提交已关闭。 我已经添加了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);
    }
试试看{
String eidQuery=“从员工_数据中选择EID,其中活动=按EID的真实订单”;
int nextEID;
语句st=con.createStatement();
con.setAutoCommit(假);
rs=st.executeQuery(eidQuery);
while(rs.next()){
nextEID=rs.getInt(1);
String getDailyTotals=“从打孔中选择日期、总和(总计)、最大值(OUT_1),其中EID=“+nextEID+”和日期>=”“+fd+””

+“AND DATE='“+fd+””和punchs.DATE您是编程和(显然)Java新手。以下是我可以为您提供的一些建议:

  • 帮你自己一个忙,了解一下
    PreparedStatement
    。你不应该通过连接
    字符串来创建SQL
  • 您正在提交将数据库和UI Swing代码混合到一个难以调试的单一块中的经典新手sin。最好将您的应用程序分解为多个层。从封装所有数据库代码的数据访问接口开始。对其进行测试,并为您的UI提供一个实例
  • 不要在ResultSet的循环中交错更新查询。最好将两者完全分开
  • 阅读有关MVC的内容。您希望Swing视图与应用程序控制器分开。让控制器与数据访问接口交互,获取结果,并将结果提供给视图以供显示。保持它们的解耦和分开
  • 学习。它将帮助你进行测试

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

  • 帮你自己一个忙,了解一下
    PreparedStatement
    。你不应该通过连接
    字符串来创建SQL
  • 您正在提交将数据库和UI Swing代码混合到一个难以调试的单一块中的经典新手sin。最好将您的应用程序分解为多个层。从封装所有数据库代码的数据访问接口开始。对其进行测试,并为您的UI提供一个实例
  • 不要在ResultSet的循环中交错更新查询。最好将两者完全分开
  • 阅读有关MVC的内容。您希望Swing视图与应用程序控制器分开。让控制器与数据访问接口交互,获取结果,并将结果提供给视图以供显示。保持它们的解耦和分开
  • 学习。它将帮助你进行测试

  • 从java.sql.ResultSet javadoc:

    语句对象关闭时,ResultSet对象将自动关闭 生成它的文件将被关闭、重新执行或用于检索下一个文件 由多个结果序列生成的结果

    执行更新后,先前的结果集将关闭。您需要重新编写代码以说明这一点。


    最简单的返工方法可能是使用两条语句,一条用于查询,另一条用于更新,但正如duffymo在回答中所指出的,您还可以做大量的工作来改进情况。

    来自java.sql.ResultSet javadoc:

    语句对象关闭时,ResultSet对象将自动关闭 生成它的文件将被关闭、重新执行或用于检索下一个文件 由多个结果序列生成的结果

    执行更新后,先前的结果集将关闭。您需要重新编写代码以说明这一点。


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

    来自API的语句文档”默认情况下,每个语句对象只能同时打开一个ResultSet对象。因此,如果一个ResultSet对象的读取与另一个ResultSet对象的读取交叉进行,则每个ResultSet对象必须由不同的语句对象生成“


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

    来自API的语句文档“默认情况下,每个语句对象只能同时打开一个ResultSet对象。因此,如果一个ResultSet对象的读取与另一个ResultSet对象的读取交叉进行,则每个ResultSet对象必须由不同的语句对象生成“


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

    附加说明:您可以通过使用一个查询来改进流程,该查询将相关数据返回到流程,而不是执行大量查询。正是如此。如果您对SQL更了解,则可以更高效地执行此操作。附加说明:您可以通过使用一个将相关数据返回到流程的查询来改进流程,而不是执行大量查询。没错。如果您更了解SQL,则可以更高效地执行此操作。您至少调用了3次
    st.executeUpdate
    。将每个任务分解为多个部分。您至少调用了
    st.executeUpdate
    至少3次。将每个任务分解为多个部分。