Java – Leyendo valores de un ResultSet despues de haber cerrado la conexion a la base de datos
abril 9, 2008
Cuando queremos leer datos de un ResultSet despues de haber cerrado la conexion (por ejemplo, si utilizamos una “Helper Class” para el acceso a datos), nos lanza una excepcion de tipo “java.sql.SQLException: Closed Connection: next”.
Para evitar esto hay que utilizar una clase que implemente la interfaz “CachedRowSet” tales como: “com.sun.rowset.CachedRowSetImpl” u “oracle.jdbc.rowset.OracleCachedRowSet”.
Si nos conectamos a una base de datos de Oracle debemos utilizar un OracleCachedRowSet porque si utilizamos un CachedRowSetImpl nos dara la excepcion java.lang.NumberFormatException: For input string: “4294967295″ – que no nos da ninguna pista de lo que ocasiono el error –
Siempre hay mas compatibilidad entre tipos del mismo proveedor ya que muchas veces la implementacion de las interfaces varia. Y si nos fijamos bien, el ResultSet que nos regresa un executeQuery es de tipo OracleResultSetImpl, asi que se lleva mejor con el OracleCachedRowSet a la hora de llenarlo.
Bueno, aqui dejo un ejemplo de como utilizarlo:
ResultSet resultSet = null;
String campo1;
Integer campo2;
try {
String sql =
“SELECT * FROM TABLA”;
resultSet = executeQuery(sql);
if(resultSet.next()) {
campo1=resultSet.getString(“CAMPO1″);
campo2 = resultSet.getInt(“CAMPO2″);
}
resultSet.close();
} catch (Exception exc) {
throw new RuntimeException(exc);
}
public ResultSet executeQuery(String sql) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
OracleCachedRowSet cachedRowSet=null;
try {
Class.forName(“oracle.jdbc.OracleDriver”);
connection =
DriverManager.getConnection(databaseURL, databaseUserName,
databaseUserPassword);
connection.setAutoCommit(false);
preparedStatement = connection.prepareStatement(sql);
resultSet = preparedStatement.executeQuery();
cachedRowSet=new OracleCachedRowSet();
cachedRowSet.populate(resultSet);
resultSet.close();
preparedStatement.close();
return cachedRowSet;
} catch (Exception exc) {
throw new RuntimeException(exc);
} finally {
try {
if ((connection != null) && (!connection.isClosed())) {
connection.close();
}
} catch (Exception exc) {
throw new RuntimeException(exc);
}
}
}


octubre 21, 2008 a las 7:57 pm
Buen datos, se me estaba haciendo dificil usar algo similar como a un datable en .NET.
Saludos
Gracias
noviembre 5, 2008 a las 4:57 pm
….Este dato me ha sido de mucha utilidad durante mucho tiempo. Increible que trabajar con resultsets (retornarlos y pasarlos como parametros) se vuelva tan complicado sin saber esto. Gracias x el artículo, sigue regalandonos tips tan útiles como estos.
junio 13, 2010 a las 4:54 pm
q bueno
enero 3, 2011 a las 8:12 am
[...] Java – Leyendo valores de un ResultSet despues de haber cerrado la conexion a la base de datos abril, 2008 3 comentários 3 [...]
marzo 2, 2011 a las 3:39 pm
Excelente aporte
Saludos
julio 16, 2011 a las 9:13 am
Excelente, gusto lo que necesitaba, gracias