2012-06-12 36 views
5

Cuando mis datos de resultados es grande me sale com.ibm.db2.jcc.am.SqlException: [jcc][t4][10120][10898][4.9.78] Invalid operation: result set is closed. ERRORCODE=-4470, SQLSTATE=null excepción pero no cuando trato con menos cantidad de datos en el conjunto de resultadosoperación no válida: conjunto de resultados está cerrado

continuación es mi fragmento de código

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

Respuesta

10

Mantener

stmt = conn1.createStatement(); 

antes del bucle.

7

De Java docs:

Un objeto ResultSet se cierra automáticamente por el objeto Statement que lo generó cuando ese objeto Statement se cierra, se vuelve a ejecutar o se usa para recuperar el n resultado externo de una secuencia de resultados múltiples.

De ahí el error.

Su objeto de declaración stmt se está volviendo a ejecutar cada vez en su bucle for.

Además, from here:

Para los cursores no se celebró, cuando el conductor termina pasando a través de la primera ResultSet, el conductor fluirá comprometerse si el compromiso automático está activado, y que se cerrará todo lo demás. Si desea que el otro ResultSet permanezca abierto, puede usar el cursor de retención.


EDIT:

(al OP - amabilidad de publicar un fragmento de No seguir cambiando fragmentos todo el tiempo.) La respuesta todavía es el mismo: se utiliza en dos consultas el mismo ResultSet, en su lazo for. Eso no va a funcionar. El ResultSet se cerrará si vuelve a ejecutar el mismo objeto Statement con diferentes consultas. Utilice diferentes objetos Statement o utilice un enfoque diferente y omita esta idea de bucle for.

Cuestiones relacionadas