Sie sind auf Seite 1von 8

contar registros en ResultSet

http://www.forosdelweb.com/f45/contar-registros-resultset-207795/

Necesitaba saber cuantos registros me devolvan las consultas a la base de datos en un


ResultSet para no tener que hacer la consulta dos veces, despus de leer varios foros y
buscar en diferentes pginas y no encontrar una solucin completa estuve experimentando
algunas cosas, ahora que lo he logrado les quiero compartir la forma en que lo logre por si
alguien llega a necesitarla.

Yo utilice Oracle express edition como SGBD y Java como lenguaje de desarrollo, las
librerias que use fueron ojdbc14.jar y ojdbc14_g.jar por estar trabajando con oracle (se
encuentran en la carperta donde queda instalado oracle), jstl.jar (se descarga desde
http://jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi) y jsp-api.jar y
servlet-api.jar (se encuentran en la carpeta donde queda intalado el apache tomcat).

El cdigo es el siguiente:

import Connections.Conexion;
import java.sql.ResultSet;
import javax.servlet.jsp.jstl.sql.Result;
import javax.servlet.jsp.jstl.sql.ResultSupport;

public class CConsultas


{

public String[] consulta()


{

//Crea la conexin con la base de datos


Conexion con=new Conexion("oracle.jdbc.driver.OracleDriver","jdbc:o
racle:thin:@127.0.0.1:1521:XE","Usuario","Contrase a");

//Realiza la consulta y la almacena en un ResultSet


ResultSet resp=con.query1("select Nombre from Campo");

//Convierte el ResultSet en un Result


Result result = ResultSupport.toResult(resp);

//Devuelve el nmero de filas devueltas en la consulta


int rowcount = result.getRowCount( );

//Devuelve el resultado de la consulta y lo almacena en un vector de String


Object[][]resp3=result.getRowsByIndex();
String resp2[]=new String[rowcount];
for(int i=0;i<rowcount;i++)
resp2[i]=resp3[i][0].toString();

//Cierra la conexin
con.closeStatement();

//Retorna el resultado en un vector de String


return resp2;
}

Si el resultado devuelto no es un String sino otro tipo de dato como por ejemplo un double,
en el for se hace la conversion, quedaria entonces:

double resp2[]=new double[rowcount];


for(int i=0;i<rowcount;i++)
resp2[i]=Double.valueOf(resp3[i][0].toString());

Espero les sirva de ayuda!!!

OTRA OPCIN

http://www.laneros.com/archive/index.php/t-77181.html

Eso no es posible en JDBC, y es inevitable por razones de rendimiento, pero para ayudarte
mejor con el inconveniente mejor comentanos porqu necesitassaber con antelacin la
cantidad de registros? ... igual puedes saberla al finalizar el recorrido de los resultados.

Muchas gracias don Rulas. Resulta que tengo un mtodo que recibe un parametro, con ese
parametro accede una tabla y devuelve todos los registros que cumplen la condicin en un
Array. Como usted muy bien sabe, en Java los arrays son estaticos, entonces debo
dimensionar el array antes de iniciar con la insercin de las posiciones.

Una solucin que me dieron fue utilizar Arraylist en vez del array, pero desconozco como
funciona.

Pues despues de que tenga el ResultSet puede crear una copia y ponerla iterar para saber
cuantos registros tiene, es decir:
for (int i=0; rset.next (); i++)
donde rset es el result set del la sentencia. en teoria le deberia quedar en i el numero de
registros. Es mejor que hacer el count sobre la base de datos.

salu2

Esa solucin me gusta ms que la que tengo actualmente ya que como dices, me evito un
acceso a la BD.

Gracias,

swoko
septiembre 13, 2006, 09:09
Un ArrayList es como un arreglo pero es dinmico, no necesitas decirle cuntos elementos
tiene al inicio, simplemente usas el mtodo add() y le agregas el objeto.

KERBEROS
septiembre 13, 2006, 09:28
Un ArrayList es como un arreglo pero es dinmico, no necesitas decirle cuntos elementos
tiene al inicio, simplemente usas el mtodo add() y le agregas el objeto.

Ejemplito!! ejemplito!!

Como meto un objeto a un arraylist y luego como recorro esa estructura?

Gracias,

Grissom.
septiembre 13, 2006, 09:43
Debes leer ms acerca de Collections en Java, eso es un tema bien extenso y con muchas
cosas por aprender: List, Set y Map son interfaces y tienen muchas implementaciones para
diferentes problemas, unas con soporte de acceso concurrente, otras sin soporte de acceso
concurrente pero ms eficientes ... unas usas algoritmos de lista enlazada, otras arrays
dinmicos, otras diccionarios de cdigo hash, otras .... no hermano ! ... es dificil dar una
respuesta si se ve de un punto de vista bien global ... es ms, puede usar una Collection para
posteriormente convertirla a Array y retornarla en el mtodo, hay ms de una forma de
hacerlo.

Finalmente, mientras aprende use la que sea, ArrayList puede ser, pero yo usara ArrayList
y retornara la interface List para ocultar detalles de implementacin (eso asumiendo que
ArrayList es el ms apropiado para este caso, y no Vector por ejemplo je je) ....

Este es el problema de los lenguajes robustos :( ... o para otros, son las ventajas y razn
para usarlos :D ...

Suerte.

KERBEROS
septiembre 13, 2006, 09:51
Debes leer ms acerca de Collections en Java, eso es un tema bien extenso y con muchas
cosas por aprender: List, Set y Map son interfaces y tienen muchas implementaciones para
diferentes problemas, unas con soporte de acceso concurrente, otras sin soporte de acceso
concurrente pero ms eficientes ... unas usas algoritmos de lista enlazada, otras arrays
dinmicos, otras diccionarios de cdigo hash, otras .... no hermano ! ... es dificil dar una
respuesta si se ve de un punto de vista bien global ... es ms, puede usar una Collection para
posteriormente convertirla a Array y retornarla en el mtodo, hay ms de una forma de
hacerlo.

Finalmente, mientras aprende use la que sea, ArrayList puede ser, pero yo usara ArrayList
y retornara la interface List para ocultar detalles de implementacin (eso asumiendo que
ArrayList es el ms apropiado para este caso, y no Vector por ejemplo je je) ....

Este es el problema de los lenguajes robustos :( ... o para otros, son las ventajas y razn
para usarlos :D ...

Suerte.

Todo muy claro don, Rulas, que no se diga ms, entonces a leer.
Muchas gracias a los que ayudaron en este foro.

Lo pueden cerrar, duda resuelta.

criales
septiembre 13, 2006, 05:33
Que mas aca un ejemplito sobre como sacar los datos del select

List datos;
datos = new ArrayList();
while(rset.next())
{
datos.add(rset.getString (1));
}
int tam = datos.size();
String dato1 = (String)datos.get(tam-1);

Tiene que importar la libreria de ArrayList, adems recuerde que las listas guardan datos de
cualquier tipo o objetos, el tipico error es el cast el cual le indica de que tipo es el dato que
se va a sacar de la lista, le recomiendo que lea el API de java parasaber que metodos tiene
la clase.

suerte

Grissom.
septiembre 13, 2006, 08:59
En las versiones actuales de Java no es recomendable emplear java.lang.Object para las
Collections, ni otras clases, en lugar deberan usarse Generics:

List<String> datos;
datos = new ArrayList<String>();
while(rset.next())
{
datos.add(rset.getString (1));
}
int tam = datos.size();
String dato1 = (String)datos.get(tam-1); // XXX: ???
return datos;

jomunoz
septiembre 13, 2006, 09:45
Eso generics se parecen a los templates de C++.

Que sigue? herencia multiple? destructores?

karolanet333
diciembre 26, 2007, 02:31
Hola gente !!!!

Soy nueva en el foro ... pero quera comentarles que yo teniendo el mismo problema, lo que
hice fue instanciar el statement de la siguiente manera

stat = cnn.createStatement(ResultSet.TYPE_SCROLL_INSENSIT
IVE,ResultSet.CONCUR_READ_ONLY);

luego obtuve el numero de registros y volv el resultset antes del inicio tal como se abre
apenas lo inicializamos

//rowCount
while (rs.next())
rowCount++;

//volver a poner el rs como al inicio


rs.beforeFirst();

El cdigo completo sera este:


import java.sql.*;

public class Conexion


{
private Connection cnn;
private String propiedades;
private String servidor;
private String base;
private String puerto;
private String usuario;
private String pass;

public Conexion() throws SQLException


{
// Get connection

servidor="server1";
base="base1";
usuario="user1";
pass = "123";
puerto = "1433";

DriverManager.registerDriver(new com.microsoft.jdbc.sqlserver.SQLServerDriver());
cnn = DriverManager.getConnection("jdbc:microsoft:sqlserver://" + servidor + ":" + puerto
+ ";databaseName=" + base,usuario,pass);
if (cnn != null)
{
System.out.println();
System.out.println("Successfully connected");
System.out.println();

// Meta data
DatabaseMetaData meta = cnn.getMetaData();

propiedades = "Driver Information \nDriver Name: " + meta.getDriverName();


propiedades = propiedades + "\nDriver Version: " + meta.getDriverVersion();
propiedades = propiedades + "\nDatabase Information \nDatabase Name: ";
propiedades = propiedades + meta.getDatabaseProductName();
propiedades = propiedades + "\nDatabase Version: " + meta.getDatabaseProductVersion();

System.out.println(propiedades);

Statement stat = cnn.createStatement();


//ResultSet rs = stat.executeQuery("SELECT * FROM T_TIPO_ACCESO");
ResultSet rs = stat.executeQuery("P_Sist3_Verificacion_General_xIdProp0 1, 'AA02038'");
//rs.
while (rs.next())
{
System.out.println(rs.getString("idPropiedad0"));
}
}
} // Test

public String[][] seleccionar(String sql)


{
String[][] rpta = new String[0][0];
Statement stat;
ResultSet rs;
ResultSetMetaData rsMeta;
int rowCount = 0;
int colCount = 0;

try
{
//obtener datos de la base
stat = cnn.createStatement(ResultSet.TYPE_SCROLL_INSENSIT
IVE,ResultSet.CONCUR_READ_ONLY);
rs = stat.executeQuery(sql);
rsMeta = rs.getMetaData();

//colCount
colCount = rsMeta.getColumnCount();

//rowCount
while (rs.next())
rowCount++;

//volver a poner el rs como al inicio


rs.beforeFirst();

//redimensionar la mat de strings


rpta = new String[rowCount][colCount];

//cargar la mat con los datos del rs


for (int r=0; r<rowCount; r++)
{
rs.next();
for (int c=0; c<colCount; c++)
rpta[r][c] = rs.getString(c+1);
}

}catch(SQLException e)
{
e.printStackTrace();
}

return rpta;
}

public void desconectar()


{
try
{
cnn.close();
}catch(SQLException e)
{
e.printStackTrace();
}

public static void main(String[] args)


{
try
{
new Conexion();
}catch(Exception e)
{
e.printStackTrace();
}
}

Das könnte Ihnen auch gefallen