TransWikia.com

java.sql.SQLException: Operation not allowed for a result set of type ResultSet.TYPE_FORWARD_ONLY

Stack Overflow en español Asked by Leonardo Rodríguez on December 2, 2021

en este codigo pretendo que se muestre la informacion de una base de datos a una JTable

private void botonBuscarActionPerformed(java.awt.event.ActionEvent evt) {                                            
    try {
        // TODO add your handling code here:
        DefaultTableModel modelo = (DefaultTableModel)jTable1.getModel();
        
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost/medicamentos","root","");
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT * FROM medicinas");
        
        rs.first();
        
        do{
            String[] fila= {rs.getString(1),rs.getString(2),rs.getString(3),rs.getString(4),rs.getString(5),rs.getString(6)};
            modelo.addRow(fila);
        }while(rs.next());
    } catch (SQLException ex) {
        Logger.getLogger(Consulta.class.getName()).log(Level.SEVERE, null, ex);
    }
} 

Pero al ejecutar, me muestra estos errores

java.sql.SQLException: Operation not allowed for a result set of type ResultSet.TYPE_FORWARD_ONLY.
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.result.ResultSetImpl.first(ResultSetImpl.java:584)

Alguien sabe como podria solucionarlo?

One Answer

En Java por defecto los ResultSet obtenidos en las consultas son de tipo ResultSet.TYPE_FORWARD_ONLY, esto quiere decir que el ResultSet solo puede "avanzar" de registro en registro, no puede arbitrariamente moverse a un registro puntual como por ejemplo el último, o como lo haces en tu código hacia el primero

rs.first(); //Esto solo es posible si se hace la configuración correspondiente

Esto es lo que genera la excepción. Ahora, de acuerdo a tu código realmente no tienes necesidad de moverte a un registro puntual simplemente procesar los resultados. Al efectuar una consulta el cursor del ResultSet se ubica justo antes del primero registro, lo primero que se debe hacer es validar si realmente la consulta retornó resultados, esto se logra con la instrucción:

rs.next();

Si el resultado es true, entonces hay datos, y el ResultSet se ubicara en la primera fila de datos encontrados lo que te permite ahora si tomar los valores de las columnas, lo mejor es que implementes algo así:

if(rs.next()) { //se valida si hay resultados
  do {
    //tu codigo aquí llenando con datos lo que requieres...
  } while(rs.next()); //repita mientras existan más datos
}

Como consejo adicional procura manejar de forma correcta las excepciones, en tu código si bien ocurre un problema con las instrucciones SQL no estás propiamente liberando los recursos, te invito a leer un poco sobre el Try-With-Resources

Answered by Jonnathan Q on December 2, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP