无效状态,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
实例,我们称它为updateStmt
和executeUpdate()
。
另外,请查看 Prepared Statements 以获取您的更新,它可能会更加高效和安全。
【讨论】:
以上是关于无效状态,ResultSet 对象已关闭的主要内容,如果未能解决你的问题,请参考以下文章
Java 和 SQLite:抛出 ResultSet 已关闭但仍在继续
如果ResultSet取值并存入内存,为啥ResultSet对象关闭后就不能使用了?
关于resultset 的deleteRow方法报无效的游标位置的错误
何时关闭 JDBC 中的 Connection、Statement、PreparedStatement 和 ResultSet