2011-08-31 74 views
3

我正在运行代码,但是得到“无效状态,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); 
     } 
+3

请在您的问题中发布异常堆栈跟踪,它包含有价值的信息来诊断您的问题。 –

+0

Philipp是对的。我认为你甚至可能发生网络中断,从而导致两个查询之间的连接中断,并且问题可能会导致您向我们显示的相同信息。 – Kheldar

回答

6

你不能在同一Statement执行另一个SQL查询您当前迭代与ResultSet。这样做会关闭先前打开的游标(您SELECT查询RESP ResultSet):

引述API docs for Statement

默认情况下,每个Statement对象只有一个ResultSet对象可以是开放 在同一时间。因此,如果一个ResultSet对象的读数是 与另一个ResultSet对象的读数交错,则每个必须由不同的Statement对象生成 。如果 已打开,则语句 接口中的所有执行方法隐式关闭语句的当前ResultSet对象。

Connection创建另一个Statement例如,让我们把它叫做updateStmtexecuteUpdate()在那一个。

此外,请查看Prepared Statements进行更新,它可能会更具性能和安全性。