【问题标题】:Invalid state, the ResultSet object is closed无效状态,ResultSet 对象已关闭
【发布时间】:2011-08-31 20:50:12
【问题描述】:

我正在运行代码,但是收到“无效状态,ResultSet 对象已关闭”。错误。是什么导致了错误?

try{
    query = "SELECT * FROM BUNDLE_TEMP "
                  + "MINUS "
                  + "SELECT * FROM BUNDLE";

            rs = stmt.executeQuery(query);

            while (rs.next()){
                String bundle = rs.getString("BUNDLE");
                String week = rs.getString("WEEK");
                String sched_dt = rs.getString("SCHED_DT").replace(" 00:00:00.0", "");
                String dropper_id = rs.getString("DROPPER_ID");


                query = "INSERT INTO BUNDLE "
                            + "VALUES ('"
                                + bundle+"','"
                                + week+"','"
                                + sched_dt+"','"
                                + dropper_id+"')";

                stmt.executeUpdate(query);
            }
        }catch(Exception e){
            System.out.println("Error while trying to insert into BUNDLE\n"+query+"\n"+ e);
        }

【问题讨论】:

  • 请在您的问题中发布异常堆栈跟踪,它包含诊断您的问题的宝贵信息。
  • 菲利普是对的。我认为您甚至可能会出现网络中断,从而切断两个查询之间的连接,并且该问题可能会给出您向我们显示的相同消息。

标签: java jdbc resultset


【解决方案1】:

您无法在当前使用ResultSet 迭代的同一Statement 上执行另一个SQL 查询。这样做将关闭先前打开的游标(您的 SELECT 查询和 ResultSet):

引用API docs for Statement

默认情况下,每个 Statement 对象只能打开一个 ResultSet 对象 同时。因此,如果读取一个 ResultSet 对象是 与另一个阅读交错,每个必须已经生成 通过不同的 Statement 对象。 Statement中的所有执行方法 接口隐式关闭语句的当前 ResultSet 对象,如果 打开一个存在。

从您的Connection 创建另一个Statement 实例,我们称它为updateStmtexecuteUpdate()

另外,请查看 Prepared Statements 以获取您的更新,它可能会更加高效和安全。

【讨论】:

    猜你喜欢
    • 2011-06-19
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 2018-09-17
    • 2019-04-05
    • 1970-01-01
    相关资源
    最近更新 更多