2017-04-26 44 views
-1

所以,我在執行下面的過程時在標題中看到錯誤,我真的不知道什麼是錯的。線程「main」中的異常java.sql.SQLException:ResultSet關閉後不允許操作

我在做什麼是試圖從數據庫帶來一些數據來創建一個對象,並填寫和ArrayList幾個它的對象,如果沒有找到應該拋出的例外?

public ArrayList<Caso> buscarCasosPorJuez(String cedula) throws java.sql.SQLException,Exception{ 
    java.sql.ResultSet rs; 
    String sql; 
    Caso caso; 
    ArrayList<Caso> casos = new ArrayList(); 
    sql="SELECT * "+ 
    "FROM tcaso "+ 
    "WHERE CedulaJ='"+cedula+"';"; 
    Conector.getConector().ejecutarSQL(sql); 
    rs = Conector.getConector().ejecutarSQL(sql,true); 

    while (rs.next()){ 
     caso = new Caso(
      rs.getInt("NumCaso"), 
      rs.getString("DescripcionCaso"), 
      rs.getString("EstadoCaso"), 
      rs.getDate("FechaCreacion").toLocalDate(), 
      persona.buscarJuezPorCedula(rs.getString("CedulaJ")), 
      persona.buscarQuerellante(rs.getString("CedulaQ")) 
      ); 
     casos.add(caso); 
    } 

    rs.close(); 
    return casos; 
} 

下面是兩個方法「新Caso」呼籲在最後二條線。

public Juez buscarJuezPorCedula(String cedula) throws java.sql.SQLException,Exception{ 
    Juez juez = null; 
    java.sql.ResultSet rs; 
    String sql; 
    sql = "SELECT Sala,Usuario,Clave,NombreJ,ApellidosJ,TelefonoJ,CedulaJ "+ 
    "FROM tjuez "+ 
    "WHERE CedulaJ='"+cedula+"';"; 
    rs = Conector.getConector().ejecutarSQL(sql,false); 

    if (rs.next()){ 
     juez = new Juez(
      rs.getInt("Sala"), 
      rs.getString("Usuario"), 
      rs.getString("Clave"), 
      rs.getString("NombreJ"), 
      rs.getString("ApellidosJ"), 
      rs.getString("TelefonoJ"), 
      rs.getString("CedulaJ")); 
    } else { 
     throw new Exception ("Persona no encontrada intentelo de nuevo."); 
     } 

    rs.close(); 
    return juez; 
} 

public Querellante buscarQuerellante(String cedula) throws java.sql.SQLException,Exception{ 
    Querellante querellante = null; 
    java.sql.ResultSet rs; 
    String sql; 
    sql = "SELECT DireccionQ,NombreQ,ApellidosQ,TelefonoQ,CedulaQ "+ 
    "FROM tquerellante "+ 
    "WHERE CedulaQ='"+cedula+"';"; 
    rs = Conector.getConector().ejecutarSQL(sql,true); 

    if (rs.next()){ 
     querellante = new Querellante(
      rs.getString("DireccionQ"), 
      rs.getString("NombreQ"), 
      rs.getString("ApellidosQ"), 
      rs.getString("TelefonoQ"), 
      rs.getString("CedulaQ")); 
    } else { 
     throw new Exception ("Persona no encontrada intentelo de nuevo."); 
    } 

    rs.close(); 
    return querellante; 
} 

感謝您提供的所有幫助。

+1

Exception應該告訴你導致問題的語句,所以你應該知道要調試的代碼塊。 – camickr

+1

此代碼會導致資源泄漏,但我不明白它會如何導致給定的異常,也許它是在ejutarsql方法中的東西?顯示更多代碼和堆棧跟蹤。 –

+0

告訴我們發生異常的地方,並告訴我們調用方法的代碼。 – eckes

回答

1

我懷疑你正在關閉中的Statement對象,該對象關閉了從它派生的所有ResultSets

你不能真正多用途SQL執行的方法,這樣,至少在沒有使用CachedRowSet,成本內存。

您需要沿着更傳統的線條重構此代碼,明確的ConnectorStatement對象作爲局部變量,因此您可以按照與獲取相反的順序關閉它們。

您應該使用PreparedStatements而不是將參數構建到SQL字符串中。如果你拋出一個異常,你也在泄漏結果集。

例如:

public Querellante buscarQuerellante(String cedula) throws java.sql.SQLException,Exception{ 
    String sql = "SELECT DireccionQ,NombreQ,ApellidosQ,TelefonoQ,CedulaQ "+ 
     "FROM tquerellante "+ 
     "WHERE CedulaQ=?"; 
    try (Connnector conn = ...; // TODO 
     PreparedStatement ps = conn.prepareStatement(sql); 
     ) 
    { 
     ps.setObject(1, cedula); 
     try (ResultSet rs = ps.execute()) 
     { 
      if (rs.next()){ 
       return new Querellante(
        rs.getString("DireccionQ"), 
        rs.getString("NombreQ"), 
        rs.getString("ApellidosQ"), 
        rs.getString("TelefonoQ"), 
        rs.getString("CedulaQ")); 
      } else { 
       throw new Exception ("Persona no encontrada intentelo de nuevo."); 
      } 
     } 
    } 
} 

注意,儘量與 - 資源始終關閉一切分配,並在收購的順序相反。

+0

看起來像getConector()重用單例連接,是的。 – eckes

相關問題