5

当我的结果集数据很大时,我会遇到 com.ibm.db2.jcc.am.SqlException: [jcc][t4][10120][10898][4.9.78] Invalid operation: result set is closed. ERRORCODE=-4470, SQLSTATE=null异常,但当我尝试在结果集中使用较少的数据时不会

下面是我的代码片段

ResultSet rs=null;
String sql_query="select * from exception_main;select * from m_roles"
String query1=sql_query.toUpperCase();
String[] results=query1.split(";");         
CSVWriter writer = new CSVWriter(new FileWriter(csv_file_path + csv_file_name), ',',CSVWriter.NO_QUOTE_CHARACTER);                     
for(int i=0;i<results.length;i++)                         
{                             
  if(results[i].startsWith("SELECT"))                             
  {                                 
    System.out.println("Inside select"+ results[i]);                             

    ps = conn1.prepareStatement(results[i].toString());                             
    rs = ps.executeQuery();             

    ...                        

    //writing to csv file                          
    System.out.println("Count..." + rs.getRow());                        
    writer.writeAll(rs, true);                         

    while(rs.next()){                                  
      rs.deleteRow();                                
    }                          
    System.out.println("Count...3:::::::" + rs1.getRow());     
  }     
}
writer.close(); 
rs.close();
4

2 回答 2

10

保持

stmt = conn1.createStatement(); 

在 for 循环之前。

于 2012-06-12T09:42:54.130 回答
7

来自Java 文档

当 Statement 对象关闭、重新执行或用于从多个结果序列中检索下一个结果时,生成它的 Statement 对象会自动关闭 ResultSet 对象。

因此你的错误。

每次循环stmt中都会重新执行您的Statement 对象。for

另外,从这里

对于非保持游标,当驱动程序完成第一个结果集的单步执行时,如果 autoCommit 处于打开状态,驱动程序将执行提交,这将关闭其他所有内容。如果您希望其他 ResultSet 保持打开状态,您可能需要使用 with hold 光标。


编辑:

(给 OP - 请发布一个片段。不要一直更改片段)答案仍然是相同的:您ResultSetfor循环中使用相同的两个查询。那是行不通的。如果您使用不同的查询重新执行相同的对象,则会ResultSet关闭。Statement要么使用不同Statement的对象,要么使用不同的方法并放弃这个for循环想法。

于 2012-06-12T09:39:41.333 回答