Si une instruction peut renvoyer non ou plusieurs résultats, vous ne devez pas utiliser executeQuery
, mais execute()
à la place, cette méthode renvoie un boolean
indiquant le type du premier résultat :
true
:le résultat est unResultSet
false
:le résultat est un nombre de mises à jour
Si le résultat est true
, alors vous utilisez getResultSet()
pour récupérer le ResultSet
, sinon getUpdateCount()
pour récupérer le nombre de mises à jour. Si le nombre de mises à jour est -1
cela signifie qu'il n'y a plus de résultats. Notez que le nombre de mises à jour sera également -1
lorsque le résultat courant est un ResultSet
. Il est également bon de savoir que getResultSet()
doit renvoyer null s'il n'y a plus de résultats ou si le résultat est un nombre de mises à jour.
Maintenant, si vous voulez récupérer plus de résultats, vous appelez getMoreResults()
(ou son frère acceptant un int
paramètre). La valeur de retour de boolean
a la même signification que celle de execute()
, donc false
ne signifie pas qu'il n'y a plus de résultats !
Il n'y a plus de résultats uniquement si getMoreResults()
renvoie faux et getUpdateCount()
renvoie -1
(comme également documenté dans le Javadoc)
Cela signifie essentiellement que si vous voulez traiter correctement tous les résultats, vous devez faire quelque chose comme ci-dessous :
boolean result = stmt.execute(...);
while(true)
if (result) {
ResultSet rs = stmt.getResultSet();
// Do something with resultset ...
} else {
int updateCount = stmt.getUpdateCount();
if (updateCount == -1) {
// no more results
break;
}
// Do something with update count ...
}
result = stmt.getMoreResults();
}
REMARQUE :Une partie de cette réponse est basée sur ma réponse à Java SQL :Statement.hasResultSet() ?