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

Saber cuantas filas tiene un ResultSet

Estas en el tema de Saber cuantas filas tiene un ResultSet en el foro de Java en Foros del Web. Hola a todos. Necesito saber cuantas filas contiene un ResultSet. ¿Hay forma de hacerlo sin recorrer todas las filas con .next()? Gracias, David...
  #1 (permalink)  
Antiguo 14/09/2006, 17:03
 
Fecha de Ingreso: agosto-2006
Mensajes: 30
Antigüedad: 17 años, 8 meses
Puntos: 0
Saber cuantas filas tiene un ResultSet

Hola a todos.
Necesito saber cuantas filas contiene un ResultSet. ¿Hay forma de hacerlo sin recorrer todas las filas con .next()?

Gracias,

David
  #2 (permalink)  
Antiguo 15/09/2006, 00:55
 
Fecha de Ingreso: noviembre-2005
Mensajes: 97
Antigüedad: 18 años, 5 meses
Puntos: 0
Creo que no se puede, no me suena al menos. Pero puedes hacer un

ResultSet rs;
..

rs.last();
int cuantos = rs.getRow();


en vez de hacer tantos .next(). Te devolverá el número de la última fila, lo que no sé es si tendrás que sumarle 1, restarle 1, o quedarte con ese número ya (haz alguna pruebita) para saber cuantas filas hay.
  #3 (permalink)  
Antiguo 15/09/2006, 01:03
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Hola:

No puedes saber cuantas filas tiene un resultSet sin recorrerlo previamente.

Otra opción es realizar primero una consulta que te diga cuantos resultados hay

select count ...

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #4 (permalink)  
Antiguo 16/09/2006, 08:42
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Depende del Driver JDBC y de si soporta el tipo de cursores que te devuelven el numero de filas sin contarlas tu.
  #5 (permalink)  
Antiguo 19/09/2006, 15:26
 
Fecha de Ingreso: agosto-2006
Mensajes: 30
Antigüedad: 17 años, 8 meses
Puntos: 0
Saber cuantas filas tiene un ResultSet

Hola gracias por responder, no había podido contestar porque hemos estado migrando los equipos a un nuevo dominio y no ne había conectado hasta ahorita.

el punto es que el JDBC (de Microsoft) no soporta este tipo de cursores y no quiero hacer 2 veces la consulta, también el problema de hacer un .last() es que no se puede regresar al primer registro.

He leído que se puede utilizar el RowSet, pero no sé donde encontrar un tutorial de como usarlo, si alguien sabe ...

Saludos y gracias.

David.
  #6 (permalink)  
Antiguo 20/09/2006, 00:06
 
Fecha de Ingreso: noviembre-2005
Mensajes: 97
Antigüedad: 18 años, 5 meses
Puntos: 0
La interfaz ResultSet también tiene un método first(), no funciona en tu Driver JDBC? porque podrías hacer

ResultSet rs;
..

rs.last();
int cuantos = rs.getRow();
rs.first();


O al menos según el API sí. Por otro lado, por qué quieres volver al primero? si lo que vas a hacer es recorrer el resultado leído (digo yo que para eso quieres volver al primero otra vez), porque no cuentas a la vez que vas pasando por todos los next()?
  #7 (permalink)  
Antiguo 20/09/2006, 08:29
 
Fecha de Ingreso: agosto-2006
Mensajes: 30
Antigüedad: 17 años, 8 meses
Puntos: 0
Hola Raiko,

"O al menos según el API sí. Por otro lado, por qué quieres volver al primero? si lo que vas a hacer es recorrer el resultado leído (digo yo que para eso quieres volver al primero otra vez), porque no cuentas a la vez que vas pasando por todos los next()?"

Bueno no me deja hacer un .first(), dice que el objeto no soporta este tipo de cursores. En cuanto a porqué quiero regresar al primero, es porque el metodo lo que hace es devolverme un Object por cada fila del ResultSet, pero el caso es que cuando el ResultSet no tiene filas, debo devolver null (pero un ResultSet vacío no es null); entonces como hago para saber si el mencionado RS está vacío sin recorrerlo primero, pues si le hago .next() ó .last(), luego tengo que regresar a la primera fila para crear el Object.

Espero haberme dado a entender,

Saludos.
  #8 (permalink)  
Antiguo 20/09/2006, 09:39
 
Fecha de Ingreso: noviembre-2005
Mensajes: 97
Antigüedad: 18 años, 5 meses
Puntos: 0
Podrías pegar aquí el código? no veo el problema que planteas.

Quiero decir, en cuanto entras en un rs.next() ya sabes que tiene resultados, luego no devolveras null. Si por el contrario no entras, devuelves null. Por ejemplo:

Código PHP:
List listaObjetos = new ArrayList();
Objeto miObjeto null;
while (
rs.next()){
   
miObjeto = new Objeto();
   
miObjeto.setAlgo(rs.getString("Columna1"));
   
miObjeto.set...;
   ...
   
listaObjetos.add(miObjeto);

}
if (
objeto == null ){
   
listaObjetos=null;
}
return 
lista
Si pegas el código seguro que encontramos una buena solución.

Otro tipo de solución sería:

Código PHP:
Objeto miObjeto null;
if(
rs.next()){
   
miObjeto = new Objeto();
   
miObjeto.setAlgo(rs.getString("Columna");
   ...
}
return 
miObjeto
Eso devuelve null si está vacío también.
  #9 (permalink)  
Antiguo 20/09/2006, 10:40
 
Fecha de Ingreso: agosto-2006
Mensajes: 30
Antigüedad: 17 años, 8 meses
Puntos: 0
"Quiero decir, en cuanto entras en un rs.next() ya sabes que tiene resultados, luego no devolveras null. Si por el contrario no entras, devuelves null."

Bueno trataré de mostrar código:
Código PHP:
//Este método recibe la cadena sql a ejecutar, con una Connection y Statement declarados por supuesto y que no expongo aquí por cuestiones de código más claro...

public Object[] ConsultaObject(String SQL,Class Clase) {
   
Object[] Resultado;
   
Rs St.executeQuery(SQL);
   if (
Rs.next()) { //Aquí necesito validar si hay registros.
      
Resultado this.ObtenerObjetos(Rs,Clase); //llama a otro método
   
}
   else {
      
Resultado null;
   }
   return 
Resultado;   
}

//Este otro método recibe por párametro el ResulSet creado en el anterior y se encarga de crear el Object[] según los campos del parámetro Class y de la metadata del ResultSet (que no expongo por el motivo que ya expliqué anteriormente)

private Object[] ObtenerObjetos(ResultSet Rs,Class Clase) {
   
Vector Listado = new Vector();
   while(
Rs.next()) { //Aquí se posiciona en la fila 2
      
Object Objeto Clase.newInstance();
      
//{
      //Código de llenado de Objeto con los datos de la fila
      //}
    
Listado.add(Objeto);
   }

El detalle que me sucede es que si en el metodo ConsultaObject defino Rs.next(), cuando estoy en el método ObtenerObjetos se pierde la primera fila y si el RS solo tiene una fila, entonces lanza un error, si el RS tiene 2 ó más filas llena el array de objetos, pero sin la primera fila (por eso necesito posicionarme en la primera fila).
El punto es que en algún lado necesito validar si hay filas y comenzar a recorrerlo desde la fila 1. Si hago esto en el método ObtenerObjetos, cuando entra en el while ya no es la primera fila, pues en el famoso ResulSet solo puedo utilizar .next(). Si ejecuto la consulta 2 veces no hay problema, pero es lo que quería evitar.

Saludos.
  #10 (permalink)  
Antiguo 21/09/2006, 00:10
 
Fecha de Ingreso: noviembre-2005
Mensajes: 97
Antigüedad: 18 años, 5 meses
Puntos: 0
Entiendo tu problema, pero yo creo que no tienes ninguno la cuestión es organizar mejor las cosas. Puedes hacer dos cosas:

1. Copiar el método obtenerObjetos dentro del while de ConsultaObject
2. Simplemente cambiar la forma en la que haces el obtenerObjetos. Cuando entra ahí ya sabes que hay resultados leídos y un next() hecho. Puedes crear un objeto nada más entrar ya y luego hacer el while también dentro de ese método. O usar el do-while como sigue:


Código PHP:
//Este método recibe la cadena sql a ejecutar, con una Connection y Statement declarados por supuesto y que no expongo aquí por cuestiones de código más claro...

public Object[] ConsultaObject(String SQL,Class Clase) {
   
Object[] Resultado;
   
Rs St.executeQuery(SQL);
   if (
Rs.next()) { //Aquí necesito validar si hay registros.
      
Resultado this.ObtenerObjetos(Rs,Clase); //llama a otro método
   
}
   else {
      
Resultado null;
   }
   return 
Resultado;   
}

//Este otro método recibe por párametro el ResulSet creado en el anterior y se encarga de crear el Object[] según los campos del parámetro Class y de la metadata del ResultSet (que no expongo por el motivo que ya expliqué anteriormente)

private Object[] ObtenerObjetos(ResultSet Rs,Class Clase) {
   
Vector Listado = new Vector();
   do{
      
Object Objeto Clase.newInstance();
      
//{
      //Código de llenado de Objeto con los datos de la fila
      //}
    
Listado.add(Objeto);
   }while(
Rs.next());


Y ya está si te da problemas me dices, saludos!!
  #11 (permalink)  
Antiguo 21/09/2006, 12:39
 
Fecha de Ingreso: agosto-2006
Mensajes: 30
Antigüedad: 17 años, 8 meses
Puntos: 0
Hola Raiko,
Verdaderamente me has ayudado, la solución resultó mejor con el do...while, porque el método ObtenerObjetos en algún momento lo podría utilizar desde otro lado. Agradezco mucho tu colaboración.

Saludos y gracias.
  #12 (permalink)  
Antiguo 22/09/2006, 01:31
 
Fecha de Ingreso: noviembre-2005
Mensajes: 97
Antigüedad: 18 años, 5 meses
Puntos: 0
De nada, cualquier cosa ya sabes que estamos aquí para ayudarnos entre todos

  #13 (permalink)  
Antiguo 22/09/2006, 01:32
 
Fecha de Ingreso: noviembre-2005
Mensajes: 97
Antigüedad: 18 años, 5 meses
Puntos: 0
De nada, cualquier cosa ya sabes que estamos aquí para ayudarnos entre todos

  #14 (permalink)  
Antiguo 22/09/2006, 01:34
 
Fecha de Ingreso: noviembre-2005
Mensajes: 97
Antigüedad: 18 años, 5 meses
Puntos: 0
De nada, cualquier cosa ya sabes que estamos aquí para ayudarnos entre todos

  #15 (permalink)  
Antiguo 20/12/2010, 11:06
 
Fecha de Ingreso: noviembre-2010
Mensajes: 29
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Saber cuantas filas tiene un ResultSet

Que asco, estpd JDBC como no va a tener un metodo para contabilizar todo.. no se vayan a morir... u.u*
  #16 (permalink)  
Antiguo 21/12/2010, 11:28
 
Fecha de Ingreso: octubre-2010
Mensajes: 27
Antigüedad: 13 años, 6 meses
Puntos: 2
Respuesta: Saber cuantas filas tiene un ResultSet

Hola DavidOrtiz,

Sugiero que hagas 2 querys, el primero que te devuelva el numero de registros y el segundo que te devuelva el listado.

1: select count(*) as cantidad from mitabla where condicion
2: select * from mitabla where condicion

Es más rápido pedir el nro de registros mediante una sentencia SQL.

Bueno suelo realizar ello. Cualquier estoy en [email protected]

Saludos

Manuel
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 18:22.