78 votes

Obtenir le nombre de lignes renvoyées par un ResultSet en Java

J'ai utilisé un ResultSet qui renvoie un certain nombre de lignes. Mon code est quelque chose comme ceci :

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

Existe-t-il une méthode permettant de vérifier le nombre de lignes renvoyées par la fonction ResultSet ? Ou dois-je écrire le mien ?

0 votes

77voto

Tu Tran Points 984

Tout d'abord, vous devez créer Statement qui peut être déplacé curseur par commande :

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

Ensuite, récupérez le ResultSet comme ci-dessous :

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

Déplacez le curseur sur la dernière ligne et prenez-la :

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

Puis rangées la variable contiendra le nombre de lignes retournées par sql

2 votes

Attention : dans le cas de ojdbc, si vous appelez rs.last, le jeu de résultats est itéré et mis en cache. cela peut donc entraîner une consommation de mémoire inattendue.

67voto

Jesper Points 65733

Vous pourriez utiliser un do ... while au lieu d'une boucle while boucle, de sorte que rs.next() est appelé après l'exécution de la boucle, comme ceci :

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());
}

Ou bien comptez vous-même les rangs au fur et à mesure que vous les obtenez :

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");
}

0 votes

J'utilise le code ci-dessus et j'affiche les enregistrements mais je perds le premier enregistrement.

2 votes

L'index des lignes commence à partir de 1 dans le resultSet

0 votes

@FranciscI.B Aucun index de ligne n'est utilisé dans les exemples ci-dessus, donc il importe peu que l'index de ligne commence à 1 ou autre.

31voto

mprabhat Points 11553

Un simple getRowCount peut ressembler à ceci :

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;
}

Il faut juste savoir que cette méthode aura besoin d'un fichier sensible au défilement resultSet Ainsi, lors de la création de la connexion, vous devez spécifier l'option de défilement. La valeur par défaut est FORWARD et l'utilisation de cette méthode vous jettera une exception.

2 votes

La ligne resultSet.last() ; retourne une valeur booléenne, veuillez mettre l'instruction if.

9voto

Fathah Rehman P Points 2509

Une autre façon de différencier 0 ligne ou certaines lignes d'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 vous devez connaître le nombre de lignes d'un ResultSet, voici une méthode pour l'obtenir :

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

6voto

GPRathour Points 3071

res.next() Dans votre code, vous l'utilisez deux fois, d'abord pour la condition if (le curseur passe à la première ligne), puis pour la condition while (le curseur passe à la deuxième ligne).

Ainsi, lorsque vous accédez à vos résultats, il commence à partir de la deuxième ligne. Il y a donc une ligne de moins dans les résultats.

vous pouvez essayer ceci :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X