原網址:http://blog.csdn.net/sku0923/article/details/1722370
一個stmt多個rs進行操作引起的ResultSet已經關閉錯誤
一個stmt多個rs進行操作. 那么從stmt得到的rs1,必須馬上操作此rs1后,才能去得到另外的rs2,再對rs2操作. 不能互相交替使用,會引起rs已經關閉錯誤. 錯誤的代碼如下: ?stmt=conn.createStatement(); ?
rs=stmt.executeQuery("select * from t1"); ?
rst=stmt.executeQuery("select * from t2");
rst.last();
?rs.last();//由于執行了rst=stmt.executeQuery(sql_a);rs就會被關閉掉!所以程序執行到此會提示ResultSet
已經關閉.錯誤信息為:java.sql.SQLException: Operation not allowed fter ResultSet closed??
正確的代碼:
?stmt=conn.createStatement(); ?
rs=stmt.executeQuery("select * from t1"); ?
rs.last();//對rs的操作應馬上操作,操作完后再從數據庫得到rst,再對rst操作
?rst=stmt.executeQuery("select * from t2");
?rst.last();
原因是: ?The? object? used? for? executing? a? static? SQL? statement? and? returning? the? results? it? produces.?? ? ?By? default,? only? one? ResultSet? object? per? Statement? object? can? be? open? at? the? same? time.? Therefore,? if? the? reading? of? one? ResultSet? object? is? interleaved? with? the? reading? of? another,? each? must? have? been? generated? by? different? Statement? objects.? All? execution? methods? in? the? Statement? interface? implicitly? close? a? statment's? current? ResultSet? object? if? an? open? one? exists.?? ? ?
一個stmt最好對應一個rs, 如果用一個時間內用一個stmt打開兩個rs同時操作,會出現這種情況. 所以解決此類問題:1.就多創建幾個stmt,一個stmt對應一個rs;2.若用一個stmt對應多個rs的話,那只能得到一個rs后就操作,處理完第一個rs后再處理其他的,如上"正確代碼".
多個stmt對應各自的
rs. stmt=conn.createStatement();
stmt2=conn.createStatement();
rs=stmt.executeQuery("select * from t1");
rst=stmt2.executeQuery("select * from t2");
rs.last();
rst.last();