web-dev-qa-db-fra.com

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

J'ai utilisé une 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 pour vérifier le nombre de lignes renvoyées par la variable ResultSet? Ou dois-je écrire le mien?

56
Kiran

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

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 comptez les rangs vous-même 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");
}
52
Jesper

Tout d’abord, vous devriez créer Statement qui peut être déplacé du curseur par la commande

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

Récupérez ensuite la ResultSet comme ci-dessous:

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

Déplacez le curseur sur la dernière ligne et récupérez-le:

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

Alors rows variable contiendra le nombre de lignes renvoyées par sql

66
Tu Tran

Une simple méthode 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;
}

Juste pour savoir que cette méthode nécessitera un resultSet sensible au défilement, vous devez donc spécifier l'option de défilement lors de la création de la connexion. La valeur par défaut est FORWARD et cette méthode lève une exception.

25
mprabhat

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 correspondant à 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 ;    
}
7
Fathah Rehman P

La méthode res.next() amène le pointeur à la ligne suivante. et 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, cela commence à la deuxième ligne. Donc montre 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());
}
5
gprathour

Vous pouvez compter avec SQL et récupérer la réponse à partir du résultat comme suit:

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

Ici, je compte tout, mais vous pouvez facilement modifier le SQL pour compter en fonction d'un critère.

4
Emmanuel John
        rs.last();
        int rows = rs.getRow();
        rs.beforeFirst();
3
Nael Abd eljawad

Vous pouvez charger le ResultSet dans un TableModel, puis créer un JTable qui utilise ce TableModel, puis utiliser la méthode table.getRowCount (). Si vous voulez afficher le résultat de la requête, vous devez le faire quand même.

ResultSet resultSet;
resultSet = doQuery(something, somethingelse);
KiransTableModel myTableModel = new KiransTableModel(resultSet);
JTable table = new JTable(KiransTableModel);
int rowCount;
rowCount = table.getRowCount;
0
bsdarby

c'est ma solution

 ResultSet rs=Statement.executeQuery("query");

    int rowCount=0;


    if (!rs.isBeforeFirst()) 
      {

           System.out.println("No DATA" );
        } else {
            while (rs.next()) {
                rowCount++; 
            System.out.println("data1,data2,data3...etc..");
            }
            System.out.println(rowCount);
            rowCount=0;
            rs.close();
            Statement.close();
      }
0
Yusuf Kalsen
Statement st = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs=st.executeQuery("select * from emp where deptno=31");
rs.last();
System.out.println("NoOfRows: "+rs.getRow());

la première ligne de code indique que nous pouvons nous déplacer n'importe où dans le jeu de résultats (soit vers la première ligne ou la dernière ligne, soit avant la première ligne sans qu'il soit nécessaire de parcourir ligne par ligne à partir de la première ligne ce qui prend du temps) .second ligne récupère les enregistrements correspondant à la requête ici, je suppose (25 enregistrements), la troisième ligne de code déplace le curseur vers la dernière ligne et la dernière ligne de code obtient le numéro de ligne actuel qui est 25 dans mon cas. s'il n'y a pas d'enregistrements, rs.last renvoie 0 et getrow déplace le curseur avant la première ligne, renvoyant ainsi une valeur négative indiquant qu'aucun enregistrement n'est enregistré dans la base de données

0
pradeep kumar

Si votre requête ressemble à ceci SELECT Count(*) FROM tranbook, faites ceci rs.next(); System.out.println(rs.getInt("Count(*)"));

0
Rkmr039