plans |
FAQ |
Código |
Chat |
login

problema con java y sql

Layer-visible-off
0
Unfavorites
0

Java Tengo una excepcion java.sql.SQLException: ResultSet close con el siguiente codigo:

public String getString(String table, String column, int id) {
    String string = "Error";
    try {
        Statement stmt = dbConnection.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT " + column + " FROM " + table + " where id = " + id);
        string = rs.getString(column);
        rs.close();
    } catch (SQLException ex) {
        Logger.getLogger(DbTask.class.getName()).log(Level.SEVERE, null, ex);
    }
    return string;
}
7 months ago kuadrosx said:
 

si ya lo resolviste puedes poner la solución que encontraste como respuesta y sino puedes agregar un poco más de información y el mensaje de la excepción.

4 months ago jukdulinux said:
 

El error es que debido a que cuando obtiene el resulset al ejecutar el query, no invocas el next(), este metodo mueve el apuntador una posición y te indica si hay elementos en esa posición; inicialmente el result set apunta a un posición antes del primer registro, por eso debes llamar el metodo next(), para que se coloque en el primer registro y te indique si hay o no registros por sacar. Cabe destacar que cada posición del result set es un registro de la consulta; es importante que lleves control sobre los elementos a sacar con el next, para que no tengas sorpresas de excepciones.

A continuacion te dejo el javadoc del metodo.

boolean java.sql.ResultSet.next() throws SQLException Moves the cursor froward one row from its current position. A ResultSet cursor is initially positioned before the first row; the first call to the method next makes the first row the current row; the second call makes the second row the current row, and so on.

When a call to the next method returns false, the cursor is positioned after the last row. Any invocation of a ResultSet method which requires a current row will result in a SQLException being thrown. If the result set type is TYPE_FORWARD_ONLY, it is vendor specified whether their JDBC driver implementation will return false or throw an SQLException on a subsequent call to next.

If an input stream is open for the current row, a call to the method next will implicitly close it. A ResultSet object’s warning chain is cleared when a new row is read.


1
correct_answer

Para poder ayudar por favor incluir mas información al respecto.

Una buena práctica respecto a los close es hacerlas en el bloque finally

    ResultSet rs = null;
    try {
     rs = stmt.executeQuery(....);
    } catch(SQLException ex) {
         // Log Exception
    } finally {
         if(rs != null) {
              rs.close();
          }
    }
answered 6 months ago
xphree 21
from Colombia

0

Perdón me equivoque de bloque, aquí esta mi respuesta:
El error es que debido a que cuando obtiene el resulset al ejecutar el query, no invocas el next(), este método mueve el apuntador una posición y te indica si hay elementos en esa posición; inicialmente el result set apunta a un posición antes del primer registro, por eso debes llamar el metodo next(), para que se coloque en el primer registro y te indique si hay o no registros por sacar. Cabe destacar que cada posición del result set es un registro de la consulta; es importante que lleves control sobre los elementos a sacar con el next, para que no tengas sorpresas de excepciones. Y como dice xphree, es buena practica cerrar los objetos que tienen que ver con la consulta en un bloque finally. Por ultimo te recomendaría que le dieras un vistazo a spring framework, ya que con el puedes manejar pool de conexiones, manejo de transacción, y evitar estos problemas, con el manejo de las conexiones.

answered 4 months ago
jukdulinux 8 1
from Colombia