Foros del Web » Programación para mayores de 30 ;) » Java »

ResultSet y mysql

Estas en el tema de ResultSet y mysql en el foro de Java en Foros del Web. ¡Hola!. Vereis, necesito conocer el número de filas de una consulta ResultSet. La base de datos está implementada en mysql. La cosa es que hago ...
  #1 (permalink)  
Antiguo 13/08/2009, 10:02
 
Fecha de Ingreso: marzo-2006
Mensajes: 106
Antigüedad: 18 años, 2 meses
Puntos: 0
ResultSet y mysql

¡Hola!.

Vereis, necesito conocer el número de filas de una consulta ResultSet. La base de datos está implementada en mysql. La cosa es que hago un resultSet.last(), luego guardo la variable resultSet.getRow(), y hago de nuevo un resultSet.first(). Pero al recorrer el resultSet no me recorre bien la consulta. ¿Mysql no soporta estas operaciones?.

Un saludo.
__________________
"El río más profundo siempre es el más silencioso"
  #2 (permalink)  
Antiguo 13/08/2009, 12:03
 
Fecha de Ingreso: diciembre-2007
Mensajes: 194
Antigüedad: 16 años, 4 meses
Puntos: 5
Respuesta: ResultSet y mysql

Cita:
Iniciado por Erume Ver Mensaje
¡Hola!.

Vereis, necesito conocer el número de filas de una consulta ResultSet. La base de datos está implementada en mysql. La cosa es que hago un resultSet.last(), luego guardo la variable resultSet.getRow(), y hago de nuevo un resultSet.first(). Pero al recorrer el resultSet no me recorre bien la consulta. ¿Mysql no soporta estas operaciones?.

Un saludo.
Pues lo que dices que haces con el rs es correcto, asi que el problema estara en tu consulta a la base de datos, si quieres, puedes ponernos el metodo en el que tienes implementado toda la consulta.
__________________
Aprender J2EE en www.programacionj2ee.com.
Mi framework PHP D Framework.
  #3 (permalink)  
Antiguo 13/08/2009, 12:48
 
Fecha de Ingreso: marzo-2006
Mensajes: 106
Antigüedad: 18 años, 2 meses
Puntos: 0
Respuesta: ResultSet y mysql

Cita:
Iniciado por MiLLeN Ver Mensaje
Pues lo que dices que haces con el rs es correcto, asi que el problema estara en tu consulta a la base de datos, si quieres, puedes ponernos el metodo en el que tienes implementado toda la consulta.
Gracias por tu respuesta. Si, es lo que se suele hacer, o eso tengo entendido. Por eso me extraña que no funcione. Posteo a continuación el trozo referente a la consulta.

Código:
              Statement statement = connection.createStatement();
              ResultSet res;
              //Ejecutamos la consulta sql, generada arriba
              res = statement.executeQuery(sql);
              
              res.last();
              int length = res.getRow();
              res.first();

              while(res.next()){
                      //Aquí recorro la consulta
              }
Cuando ejecuto el código, me salta un EOFException, cosa que no ocurre cuando pongo directamente en la variable length el valor que le corresponde (evitando así el res.last(); y res.first();).

Como dije antes, utilizo Mysql, con su correspondiente conector.

Un saludo.
__________________
"El río más profundo siempre es el más silencioso"
  #4 (permalink)  
Antiguo 13/08/2009, 13:00
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: ResultSet y mysql

Hola:

Un ResultSet por defecto sólo se puede recorrer hacia delante. Si pones last(), ya no puedes volver al principio.

Para que el ResultSet sea "navegable" en ambos sentidos, en la llamada a createStatement tienes que pasar unas constantes que así lo indiquen (echa un ojo a la API para poder ver posibles valores). Aun así, deberás verificar si el driver de MySQL soporta que el resultset sea "scrollable" (que es como creo que se llama a esa propiedad).

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #5 (permalink)  
Antiguo 13/08/2009, 13:01
 
Fecha de Ingreso: diciembre-2007
Mensajes: 194
Antigüedad: 16 años, 4 meses
Puntos: 5
Respuesta: ResultSet y mysql

Cita:
Iniciado por Erume Ver Mensaje
Gracias por tu respuesta. Si, es lo que se suele hacer, o eso tengo entendido. Por eso me extraña que no funcione. Posteo a continuación el trozo referente a la consulta.

Código:
              Statement statement = connection.createStatement();
              ResultSet res;
              //Ejecutamos la consulta sql, generada arriba
              res = statement.executeQuery(sql);
              
              res.last();
              int length = res.getRow();
              res.first();

              while(res.next()){
                      //Aquí recorro la consulta
              }
Cuando ejecuto el código, me salta un EOFException, cosa que no ocurre cuando pongo directamente en la variable length el valor que le corresponde (evitando así el res.last(); y res.first();).

Como dije antes, utilizo Mysql, con su correspondiente conector.

Un saludo.
Si, eso ya se que lo haces, pero lo que precisamente es mas importante es justo lo que eliminas, lo que quiero ver es como generas la consulta, si realizas bien los pasos para generar correctamente una consulta y despues, si lo haces bien como manipulas el resultset.
__________________
Aprender J2EE en www.programacionj2ee.com.
Mi framework PHP D Framework.
  #6 (permalink)  
Antiguo 13/08/2009, 19:40
 
Fecha de Ingreso: marzo-2006
Mensajes: 106
Antigüedad: 18 años, 2 meses
Puntos: 0
Respuesta: ResultSet y mysql

Cita:
Iniciado por MiLLeN Ver Mensaje
Si, eso ya se que lo haces, pero lo que precisamente es mas importante es justo lo que eliminas, lo que quiero ver es como generas la consulta, si realizas bien los pasos para generar correctamente una consulta y despues, si lo haces bien como manipulas el resultset.
Este es el código completo de la consulta a la base de datos.

¿Sabeis si los drivers de mysql soportan ese "scrollable?.

Un saludo.

Código:
             Connection connection;
             Class.forName("com.mysql.jdbc.Driver"); //Construyendo el driver con el conector mysql
             String url = "jdbc:mysql://localhost/Miproyecto"; //La dirección de la base de datos
             String usr = "miusuario"; //El usuario de la base de datos
             String pass = "micontraseña"; //La contraseña de la base de datos
             String var1 = request.getParameter("var1");
             String sql = "Select * From MiTabla Where var1='" + var1 +
                  "';";
               connection = DriverManager.getConnection(url, usr, pass);
              Statement statement = connection.createStatement();
              ResultSet res;
              //Ejecutamos la consulta sql, generada arriba
              res = statement.executeQuery(sql);
              
              res.last();
              int length = res.getRow();
              res.first();

              while(res.next()){
                      //Aquí recorro la consulta
              }
__________________
"El río más profundo siempre es el más silencioso"
  #7 (permalink)  
Antiguo 14/08/2009, 01:12
 
Fecha de Ingreso: diciembre-2007
Mensajes: 194
Antigüedad: 16 años, 4 meses
Puntos: 5
Respuesta: ResultSet y mysql

Cita:
Iniciado por Erume Ver Mensaje
Este es el código completo de la consulta a la base de datos.

¿Sabeis si los drivers de mysql soportan ese "scrollable?.

Un saludo.

Código:
             Connection connection;
             Class.forName("com.mysql.jdbc.Driver"); //Construyendo el driver con el conector mysql
             String url = "jdbc:mysql://localhost/Miproyecto"; //La dirección de la base de datos
             String usr = "miusuario"; //El usuario de la base de datos
             String pass = "micontraseña"; //La contraseña de la base de datos
             String var1 = request.getParameter("var1");
             String sql = "Select * From MiTabla Where var1='" + var1 +
                  "';";
               connection = DriverManager.getConnection(url, usr, pass);
              Statement statement = connection.createStatement();
              ResultSet res;
              //Ejecutamos la consulta sql, generada arriba
              res = statement.executeQuery(sql);
              
              res.last();
              int length = res.getRow();
              res.first();

              while(res.next()){
                      //Aquí recorro la consulta
              }
Para que el resulset sea "scrollable" debes pasarle los siguientes parametros. (Sacado de la propia API)

Código:
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
Bien, varias cosas, primero, con la conexion lo mejor que deberias hacer es declarar una clase con un singleton para el objeto conexion. Y sin matarte mucho la cabeza, ni usar EJB (http://www.dcc.uchile.cl/~jbarrios/J2EE/node53.html aqui tienes un buen tuto sobre ellos por si te animas), en el constructor inicias esa conexion y metes la conexion en la sesion. Y de ahi la reutilizas.

Segundo, tal y como creas la consulta de la base de datos tienes un agujero de seguridad impresionante, hazlo con un PrepareStatement:

Código:
String sql = "Select * From MiTabla Where var1= ?";

PreparedStatement statement = connection.prepareStatement(sql);
ps.setString(1, var1);

res = ps.executeQuery();
Un saludo.
__________________
Aprender J2EE en www.programacionj2ee.com.
Mi framework PHP D Framework.

Última edición por MiLLeN; 14/08/2009 a las 01:17
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:38.