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?
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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP