操作无效:结果集已关闭

hap*_*ppy 5 java jdbc java-ee

当我的结果集数据很大时,我得到了 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();
Run Code Online (Sandbox Code Playgroud)

ani*_*dha 10

保持

stmt = conn1.createStatement(); 
Run Code Online (Sandbox Code Playgroud)

在for循环之前.


Kaz*_*ara 7

来自Java文档:

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

因此你的错误.

您的stmtStatement对象每次都在for循环中重新执行.

另外,从这里:

对于非持有游标,当驱动程序完成单步执行第一个ResultSet时,如果启用了autoCommit,则驱动程序将流出提交,并且将关闭其他所有游标.如果希望其他ResultSet保持打开状态,则可能需要使用with hold cursor.


编辑:

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