2017-04-26 45 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

相关问题