343 votes

Java ResultSet : comment vérifier s'il y a des résultats ?

Resultset n'a pas de méthode pour hasNext. Je veux vérifier si le resultSet a une valeur.

Est-ce la bonne façon de procéder ?

if (!resultSet.next() ) {
    System.out.println("no data");
}

4 votes

Pour les futurs lecteurs comme moi : les réponses qui m'ont aidé sont celles de Felype et de Dermot Doherty.

578voto

Seifer Points 1741

En supposant que vous travaillez avec une personne nouvellement retournée ResultSet dont le curseur pointe avant la première ligne, une manière plus simple de vérifier cela est d'appeler simplement isBeforeFirst() . Cela évite de devoir revenir en arrière si les données doivent être lues.

Comme expliqué dans la documentation ce qui renvoie false si le curseur n'est pas avant le premier enregistrement ou si il n'y a pas de lignes dans le ResultSet .

if (!resultSet.isBeforeFirst() ) {    
    System.out.println("No data"); 
}

15 votes

Merci, oui je sais mais j'ai rencontré le même problème et je n'étais pas satisfait de l'aspect de l'avance pour vérifier puis du recul pour lire. J'ai pensé que cette solution plus simple pourrait profiter à d'autres personnes qui se trouvent dans la même situation.

8 votes

Notez que, au moins pour DB2, le jeu de résultats doit être de type "scrollable". Ceci peut être défini lorsque vous créez l'instruction à exécuter.

2 votes

260voto

ninesided Points 12355

C'est exact, au départ le ResultSet Le curseur de l'utilisateur pointe avant la première ligne, si le premier appel à next() renvoie à false alors il n'y avait pas de données dans le ResultSet .

Si vous utilisez cette méthode, vous devrez peut-être appeler beforeFirst() immédiatement après pour le réinitialiser, puisqu'il s'est positionné au-delà de la première rangée maintenant.

Il convient toutefois de noter que Réponse de Seifer Il existe ci-dessous une solution plus élégante à cette question.

38 votes

Mais gardez à l'esprit que s'il y a plusieurs lignes, après ce test, vous pointerez vers la première ligne. Assurez-vous donc de ne pas sauter de ligne par accident.

1 votes

Il est bon de noter que le curseur (pointeur) pointe sur la première ligne.

0 votes

@MatthewFlaschen, vous avez raison, pour résoudre le problème du saut de la première ligne, j'ai utilisé un do { ... } while (rs.next) ;

57voto

Maslow Points 7268

Vous pouvez toujours faire le prochain avant, et juste faire un contrôle post-boucle

if (!resultSet.next() ) {
    System.out.println("no data");
} else {

    do {
     //statement(s)
    } while (resultSet.next());
}

21voto

kgiannakakis Points 62727

Vous feriez normalement quelque chose comme ça :

while ( resultSet.next() ) { 
   // Read the next item
   resultSet.getString("columnName");
}

Si vous voulez signaler un ensemble vide, ajoutez une variable comptant les éléments lus. Si vous n'avez besoin de lire qu'un seul élément, alors votre code est adéquat.

5voto

Nuoji Points 1690

Cela fonctionnerait si vous voulez voir s'il y a des lignes dans le jeu de résultats oui.

Notez que next() passe toujours à la ligne suivante, donc si vous prévoyez d'effectuer une lecture de l'ensemble des résultats, vous devez en tenir compte.

L'usage habituel avec ResultSet (lors d'une simple lecture) est :

while (resultSet.next())
{
   ... read from the row here ...
}

Ce qui évidemment ne fonctionnera pas correctement si vous avez invoqué next() une fois déjà pour vérifier si le jeu de résultats était vide, alors faites attention à cela. Bien qu'il existe des méthodes pour "sauvegarder", elles ne sont pas prises en charge pour tous les types d'ensembles de résultats.

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