无效状态,ResultSet 对象已关闭

Posted

技术标签:

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

我正在运行代码,但是收到“”。错误。是什么导致了错误?

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);
        

【问题讨论】:

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

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

引用API docs for Statement:

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

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

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

【讨论】:

以上是关于无效状态,ResultSet 对象已关闭的主要内容,如果未能解决你的问题,请参考以下文章

Java 和 SQLite:抛出 ResultSet 已关闭但仍在继续

如果ResultSet取值并存入内存,为啥ResultSet对象关闭后就不能使用了?

关于resultset 的deleteRow方法报无效的游标位置的错误

何时关闭 JDBC 中的 Connection、Statement、PreparedStatement 和 ResultSet

rs.getString(1) 有啥功能?

ResultSet 的最大识别提取大小是多少[关闭]