2010-11-05 46 views
1

我試圖執行調用方法selectInAsending(...)的getPendingSalesOrderIDs()方法。SQLException:ResultSet關閉後不允許操作

但這顯示的SQLException說 值java.sql.SQLException:不允許操作的ResultSet關閉

這裏後db.endSelect()將關閉所有的連接。我認爲問題在於此。

public ArrayList getPendingSalesOrderIDs() { 

    ArrayList a = new ArrayList(); 
    try { 
     //ResultSet r = znAlSalesOrder.select("sono", ""); 
     ResultSet r = salesOrder.selectInAsending("soNo", "productionStatus = 'pending' and formatID='Zn-Al'", "soNo"); 
     r.beforeFirst(); 
     while (r.next()) { 
      a.add(r.getString(1)); 
     } 
    } catch (SQLException ex) { 

    } 
    return a; 
} 


    public ResultSet selectInAsending(String fields,String selection, String  orderField) 
     { 
     db = new Database(); 
     db.select("SELECT "+fields+" FROM "+name+" WHERE "+selection + " ORDER BY "   +orderField+ " ASC"); 
     this.rs=db.rs; 
     db.endSelect(); 
     return this.rs; 
     } 



    public void select(String query) 
    { 
     if(con!=null) 
     { 
      try { 
       System.out.println(query); 
       rs = stm.executeQuery(query); 
      } catch (SQLException ex) { 
       Logger.getLogger(Database.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    } 
+0

下面的答案是正確的,我建議您在連接,語句和結果集閱讀,學會開放的通用模式和關閉他們,特別是在特殊情況下(例如,當引發例外) – 2010-11-05 14:21:15

回答

2

如果db.endSelect()關閉你的ResultSet,爲什麼不刪除它(在selectInAsending()方法)?

您可以關閉您的ResultSet在getPendingSalesOrderIDs()方法,像這樣:

ResultSet r = null; 

try { 
    ResultSet r = salesOrder.selectInAsending("soNo", "productionStatus = 'pending' and formatID='Zn-Al'", "soNo"); 

} catch (SQLException e) { 

} finally { 
    if (r != null) { 
     try { 
      r.close(); 
     } catch (SQLException e) { 

     } 
    } 
} 
+0

偉大的答案謝謝 – Nipuna 2010-11-05 14:27:49

1

是的,問題出在db.endSelect()通話。

只要返回結果集,一旦完成,一定要致電rs.close()。這將照顧清理事情。

相關問題