Jeśli oświadczenie może zwrócić nie lub wiele wyniki, nie powinieneś używać executeQuery
, ale execute()
zamiast tego ta metoda zwraca boolean
wskazując typ pierwszego wyniku:
true
:wynik toResultSet
false
:wynik to liczba aktualizacji
Jeśli wynik jest true
, następnie użyj getResultSet()
aby pobrać ResultSet
, w przeciwnym razie getUpdateCount()
aby pobrać licznik aktualizacji. Jeśli licznik aktualizacji wynosi -1
oznacza to, że nie ma więcej wyników. Pamiętaj, że licznik aktualizacji będzie również wynosił -1
gdy bieżący wynik to ResultSet
. Warto również wiedzieć, że getResultSet()
powinien zwrócić wartość null, jeśli nie ma więcej wyników lub jeśli wynik jest liczbą aktualizacji.
Teraz, jeśli chcesz pobrać więcej wyników, wywołaj getMoreResults()
(lub jego brat akceptujący int
parametr). Zwracana wartość boolean
ma takie samo znaczenie jak execute()
, więc false
nie oznacza, że nie ma więcej wyników!
Nie ma więcej wyników tylko wtedy, gdy getMoreResults()
zwraca false i getUpdateCount()
zwraca -1
(jak również udokumentowano w Javadoc)
Zasadniczo oznacza to, że jeśli chcesz poprawnie przetworzyć wszystkie wyniki, musisz zrobić coś takiego jak poniżej:
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();
}
UWAGA:Część tej odpowiedzi jest oparta na mojej odpowiedzi na Java SQL:Statement.hasResultSet()?