Obtenga el número de filas devueltas por ResultSet en Java

4 minutos de lectura

avatar de usuario
Kiran

he usado un ResultSet que devuelve cierto número de filas. Mi código es algo como esto:

ResultSet res = getData();
if(!res.next())
{
    System.out.println("No Data Found");
}
while(res.next())
{
    // code to display the data in the table.
}

¿Hay algún método para verificar el número de filas devueltas por el ResultSet? ¿O tengo que escribir el mío?

  • Duplicado de: stackoverflow.com/questions/7545820/…

    – james.garriss

    31 de agosto de 2013 a las 14:57

avatar de usuario
tu tran

Primero, debe crear Statement que se puede mover el cursor por comando:

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

Luego recupera el ResultSet como a continuación:

ResultSet rs = stmt.executeQuery(...);

Mueva el cursor a la última fila y consígalo:

if (rs.last()) {
    int rows = rs.getRow();
    // Move to beginning
    rs.beforeFirst();
    ...
}

Después filas la variable contiene el número de filas devueltas por sql

  • cuidado: en el caso de ojdbc, si llama a rs.last, el conjunto de resultados se itera y se almacena en caché. por lo que esto puede conducir a un consumo de memoria inesperado

    – Vasilii Ruzov

    6 de mayo de 2019 a las 9:15


avatar de usuario
Jesper

Podrías usar un do ... while bucle en lugar de un while bucle, para que rs.next() se llama después de que se ejecuta el bucle, así:

if (!rs.next()) {                            //if rs.next() returns false
                                             //then there are no rows.
    System.out.println("No records found");

}
else {
    do {
        // Get data from the current row and use it
    } while (rs.next());
}

O cuente las filas usted mismo a medida que las obtiene:

int count = 0;

while (rs.next()) {
    ++count;
    // Get data from the current row and use it
}

if (count == 0) {
    System.out.println("No records found");
}

  • estoy usando el código anterior pero y muestro registros pero pierde el primer registro

    – Karan

    4 de julio de 2015 a las 4:52

  • el índice de fila comienza desde 1 en resultSet

    – Francisco

    2 de febrero de 2016 a las 16:18

  • @FranciscI.B No se usa ningún índice de fila en los ejemplos anteriores, por lo que no importa si el índice de fila comienza en 1 o cualquier otra cosa.

    – Jesper

    04/02/2016 a las 17:38

  • Tal vez @KaranRajput lo esté usando. No sé cómo puede perder el primer registro, por lo que fue un consejo en caso de que esté usando un índice sin formato.

    – Francisco

    04/02/2016 a las 23:56

avatar de usuario
mprabhat

Un simple getRowCount El método puede verse así:

private int getRowCount(ResultSet resultSet) {
    if (resultSet == null) {
        return 0;
    }

    try {
        resultSet.last();
        return resultSet.getRow();
    } catch (SQLException exp) {
        exp.printStackTrace();
    } finally {
        try {
            resultSet.beforeFirst();
        } catch (SQLException exp) {
            exp.printStackTrace();
        }
    }

    return 0;
}

Solo para tener en cuenta que este método necesitará un sensible al desplazamiento resultSet, por lo que al crear la conexión debe especificar la opción de desplazamiento. El valor predeterminado es DELANTERO y usar este método te arrojará una excepción.

  • El conjunto de resultados.last(); la fila devuelve un valor booleano, por favor ponga la declaración if.

    – Nael Marwan

    22 de mayo de 2017 a las 11:34

avatar de usuario
Fathah Rehman P.

Otra forma de diferenciar entre 0 filas o algunas filas de un ResultSet:

ResultSet res = getData();

if(!res.isBeforeFirst()){          //res.isBeforeFirst() is true if the cursor
                                   //is before the first row.  If res contains
                                   //no rows, rs.isBeforeFirst() is false.

    System.out.println("0 rows");
}
else{
    while(res.next()){
        // code to display the rows in the table.
    }
}

Si debe saber el número de filas dado un ResultSet, aquí hay un método para obtenerlo:

public int getRows(ResultSet res){
    int totalRows = 0;
    try {
        res.last();
        totalRows = res.getRow();
        res.beforeFirst();
    } 
    catch(Exception ex)  {
        return 0;
    }
    return totalRows ;    
}

avatar de usuario
gprathora

res.next() El método llevará el puntero a la siguiente fila. y en su código lo está usando dos veces, primero para la condición if (el cursor se mueve a la primera fila) y luego para la condición while (el cursor se mueve a la segunda fila).

Entonces, cuando accede a sus resultados, comienza desde la segunda fila. Entonces muestra una fila menos en los resultados.

puedes probar esto:

if(!res.next()){ 
    System.out.println("No Data Found");  
}
else{
    do{
       //your code
    } 
    while(res.next());
}

avatar de usuario
nael marwan

        rs.last();
        int rows = rs.getRow();
        rs.beforeFirst();

avatar de usuario
youpilat13

Podría contar con sql y recuperar la respuesta del conjunto de resultados así:

Statment stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, 
                                     ResultSet.CONCUR_READ_ONLY);
ResultSet ct = stmt.executeQuery("SELECT COUNT(*) FROM [table_name]");
if(ct.next()){
   td.setTotalNumRows(ct.getInt(1));
}

Aquí estoy contando todo, pero puede modificar fácilmente el SQL para contar según un criterio.

  • solución agradable y simple !!

    – im_bhatman

    11/07/2018 a las 13:40

¿Ha sido útil esta solución?