Search code examples
javasqliteresultset

Resultset closed and I have no idea why


I'll leave my code here. My problem resides in the line marked with --> <-- where I get java.sql.SQLException: ResultSet closed and I can't find the reason why.

I've tried creating a different Statement, using stat2 which works fine with the ResultSet right above this one, changing stat4 to be a PreparedStatement instead, but nothing seems to work.

I've already found trouble with the previous ResultSet in this project, so I guess I don't really understand them very well.

Anyway, if someone can give me some tips about this I would appreciate it a lot.

public void asignarOficio(AsignacionesData pagina) throws SQLException {
    Statement stat1 = con.createStatement();
    ResultSet rsObligados = stat1.executeQuery("SELECT * FROM " + TABLA_OBLIGADOS + " WHERE " + OBLIGADOS_COL_ASIGNADO + " = 'NON'");
    //POR CADA ALUMNO/A EXISTENTE EN LA TABLA BUSCAREMOS UNA OFERTA DE TFG QUE ASIGNARLE
    while(rsObligados.next()) {
        //PARA SABER QUE OFERTA DEBEMOS ASIGNAR AL ALUMNOS, PRIMERO BUSCAMOS 
        //EL PROFESOR/A QUE (ESTANDO OBLIGADO/A) MENOS TFGS DIRIJA
        Statement stat2 = con.createStatement();
        ResultSet rsMin = stat2.executeQuery("SELECT MIN("+ PROFESORES_COL_TFGS +") FROM " + TABLA_PROFESORES + " WHERE " + PROFESORES_COL_OBLIGA + " = 'SÍ'");
        int min = rsMin.getInt(1);
        System.out.println("min: " + min);
        rsMin.close();
        
        ResultSet rsProf = stat2.executeQuery("SELECT * FROM " + TABLA_PROFESORES + " WHERE " + PROFESORES_COL_TFGS + " = '" + min + "'");
        String prof = rsProf.getString(2);
        System.out.println("prof: " + prof);
        rsProf.close();
        //UNA VEZ CONSEGUIDO EL NOMBRE DEL PROFESOR/A BUSCAMOS 
        //ENTRE LAS OFERTAS DISPONIBLES, UNA QUE DIRIJA ÉL/ELLA
        Statement stat4 = con.createStatement();
        ResultSet rsOferta = stat4.executeQuery("SELECT * FROM " + TABLA_OFERTAS + " WHERE " + OFERTAS_COL_TITOR + " = '" + prof + "' AND " + OFERTAS_COL_ASIGNADA + " = 'NON'");
        ------------>int idOfer = rsOferta.getInt(1);<--------------
        System.out.println(" idOfer = " + idOfer);
        int numOfer = rsOferta.getInt(2);
        String tutOfer = rsOferta.getString(4);
        String  cotutOfer = rsOferta.getString(5);
        rsOferta.close();
        //AL TENER YA LOCALIZADO EL TFG SOLO QUEDA HACER LOS UPDATES
        //PERTINENTES EN LAS TABLAS DE LA BD
        Statement stat3 = con.createStatement();
        stat3.executeUpdate("UPDATE " + TABLA_OFERTAS + " SET " + OFERTAS_COL_ASIGNADA + " = 'OB' WHERE " + OFERTAS_COL_ID + " = '" + idOfer + "'");
        stat3.executeUpdate("UPDATE " + TABLA_OBLIGADOS + " SET " + OBLIGADOS_COL_ASIGNADO + " = 'SÍ' WHERE " + OBLIGADOS_COL_ID + " = '" + rsObligados.getInt(1) + "'");
        stat3.executeUpdate("UPDATE " + TABLA_OBLIGADOS + " SET " + OBLIGADOS_COL_SELECCION + " = " + numOfer + " WHERE " + OBLIGADOS_COL_ID + " = '" + rsObligados.getInt(1) + "'");
        if (cotutOfer.equals("")) {
            stat3.executeUpdate("UPDATE " + TABLA_PROFESORES + " SET " + PROFESORES_COL_TFGS + " = " + PROFESORES_COL_TFGS + " + 1 WHERE " + PROFESORES_COL_NOMBRE + " = '" + tutOfer + "'");
        } else {
            stat3.executeUpdate("UPDATE " + TABLA_PROFESORES + " SET " + PROFESORES_COL_TFGS + " = " + PROFESORES_COL_TFGS + " + 0.5 WHERE " + PROFESORES_COL_NOMBRE + " = '" + tutOfer + "'");
            stat3.executeUpdate("UPDATE " + TABLA_PROFESORES + " SET " + PROFESORES_COL_TFGS + " = " + PROFESORES_COL_TFGS + " + 0.5 WHERE " + PROFESORES_COL_NOMBRE + " = '" + cotutOfer + "'");
        }
    }
}

Here I provide de Log in case someone wants take a look at it:

prof: Formella, Arno

sept. 09, 2021 6:13:05 P. M. UI.AsignacionesData btn_AsignarActionPerformed


SEVERE: null

java.sql.SQLException: ResultSet closed


at org.sqlite.core.CoreResultSet.checkOpen(CoreResultSet.java:76)
at org.sqlite.core.CoreResultSet.markCol(CoreResultSet.java:103)
at org.sqlite.jdbc3.JDBC3ResultSet.getInt(JDBC3ResultSet.java:395)
at CORE.DBManager.asignarOficio(DBManager.java:754)
at UI.AsignacionesData.btn_AsignarActionPerformed(AsignacionesData.java:209)
at UI.AsignacionesData$1.actionPerformed(AsignacionesData.java:74)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6636)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
at java.desktop/java.awt.Component.processEvent(Component.java:6401)
at java.desktop/java.awt.Container.processEvent(Container.java:2263)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5012)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4919)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4548)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4489)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2764)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

I'm not able to put the log as "code" in the editor of StackOverflow, sorry for the inconvenience that may cause.


Solution

  • It looks like you are reusing Statements here:

            Statement stat2 = con.createStatement();
            ResultSet rsMin = stat2.executeQuery("SELECT MIN("+ PROFESORES_COL_TFGS +") FROM " + TABLA_PROFESORES + " WHERE " + PROFESORES_COL_OBLIGA + " = 'SÍ'");
            int min = rsMin.getInt(1);
            System.out.println("min: " + min);
            rsMin.close();
            
            ResultSet rsProf = stat2.executeQuery("SELECT * FROM " + TABLA_PROFESORES + " WHERE " + PROFESORES_COL_TFGS + " = '" + min + "'");
            String prof = rsProf.getString(2);
            System.out.println("prof: " + prof);
    

    Try to create a Statement (or even better PreparedStatments) for each query.

    Also please check if the ResultSets are not empty, SQLite may close the ResultSet when it's empty.