2012-06-12 7 views
5

Когда мои данные ResultSet велик я получаю 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(); 

ответ

7

С Java docs:

Объект ResultSet автоматически закрывается объектом Statement, который сгенерировал его, когда этот объект Statement закрыт, повторно выполняется или используется для извлечения n ext результат из последовательности нескольких результатов.

Следовательно, ваша ошибка.

Ваш объект stmt Выполняется повторное выполнение объекта в вашем цикле for.

Кроме того, from here:

Для не проводятся курсоров, когда водитель заканчивает шагая через 1 ResultSet, водитель будет течь, если совершать автокоммит дальше, и что будет закрывать все остальное. Если вы хотите, чтобы другой ResultSet оставался открытым, вы можете использовать курсор с удержанием.


EDIT:

(к OP - любезно опубликовать один фрагмент Не следует постоянно менять Snippets все время.) Ответ по-прежнему тот же: вы используете два запроса на то же ResultSet, в вашей петле for. Это не сработает. ResultSet будет закрыт, если вы повторно выполните тот же объект Statement с различными запросами. Либо используйте разные объекты Statement, либо используйте другой подход и отбросьте эту идею петли for.

Смежные вопросы