Roberto Fernandez Diaz
Roberto Fernandez Diaz

Reputation: 804

java.sql.SQLException: SQL sentence is closed at org.hsqldb.jdbc.JDBCUtil.sqlException

I am trying to insert a new row in my HSQLDB database. I have this code:

private final String SQL_CREAR_ATLETA=" INSERT INTO ATLETA (ID_ATLETA, DNI, NOMBRE, APELLIDOS, GENERO, NACIMIENTO, CORREO, TELEFONO, CODIGOFEDERACION) VALUES (?,?,?,?,?,?,?,?,?) ";

@Override
public void crearAtleta(String dni, String nombre, String apellidos, char genero, Date nacimiento, String correo,
        String telefono, String codigoFederacion) throws SQLException {

    try {
        con = Jdbc.getConnection();
        pst = con.prepareStatement(SQL_CREAR_ATLETA);

        Integer idAtleta = calcularIdAtleta(); /*this is not null , it gives the next id , for example if there are 3 athlete in the DB , will return a 4*/

        pst.setString(1, String.valueOf(idAtleta)); // <- the code crash here
        pst.setString(2, nombre);
        pst.setString(3, apellidos);
        pst.setString(4, String.valueOf(genero));
        pst.setDate(5, new java.sql.Date(nacimiento.getTime()));
        pst.setString(6, dni);
        pst.setString(7, correo);
        pst.setString(8, telefono);
        pst.setString(9, codigoFederacion);
        pst.execute();

    } catch (SQLException e) {
        e.printStackTrace();
    }

}

The program crashes at the line pst.setString(1) to set the id into the sql sentence. The stackTrace is this one :

java.sql.SQLException: SQL sentence is closed
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCStatementBase.checkClosed(Unknown Source)
    at org.hsqldb.jdbc.JDBCPreparedStatement.checkSetParameterIndex(Unknown Source)
    at org.hsqldb.jdbc.JDBCPreparedStatement.setParameter(Unknown Source)
    at org.hsqldb.jdbc.JDBCPreparedStatement.setString(Unknown Source)
    at reestructurado.persistencia.impl.AtletasGatewayImpl.crearAtleta(AtletasGatewayImpl.java:50)
    at ui.UInscripcion$1.actionPerformed(UInscripcion.java:316)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: org.hsqldb.HsqlException: sentencia SQL está cerrada
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.error.Error.error(Unknown Source)
    ... 43 more

I don't unserstand the problem. I tried to change the data type, but nothing seems to work. My table is this one:

enter image description here

Upvotes: 0

Views: 411

Answers (1)

Mick Mnemonic
Mick Mnemonic

Reputation: 7956

Even though you haven't disclosed all relevant code, the problem is likely that you are re-using the same PreparedStatement object across different methods. You are probably querying the next player id in calcularIdAtleta() using pst, which will leave the statement closed when calcularIdAtleta() returns. You shouldn't do that. Instead, use method-local variables; they make your code easier to read and less error-prone.

Try changing your method into this instead, essentially declaring the PreparedStatement locally:

public void crearAtleta(String dni, String nombre, 
        String apellidos, char genero, 
        Date nacimiento, String correo,
        String telefono, String codigoFederacion) throws SQLException {

    PreparedStatement ps = null;

    try {
        ps = Jdbc.getConnection().prepareStatement(SQL_CREAR_ATLETA);

        Integer idAtleta = calcularIdAtleta();

        ps.setString(1, String.valueOf(idAtleta));
        ps.setString(2, nombre);
        ps.setString(3, apellidos);
        ps.setString(4, String.valueOf(genero));
        ps.setDate(5, new java.sql.Date(nacimiento.getTime()));
        ps.setString(6, dni);
        ps.setString(7, correo);
        ps.setString(8, telefono);
        ps.setString(9, codigoFederacion);
        ps.execute();

    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        if (ps != null) {
            ps.close();
        }
    }    
}

Upvotes: 2

Related Questions