Zestaw wyników nie ma metody dla hasNext. Chcę sprawdzić, czy zestaw wyników ma jakąkolwiek wartość
czy to właściwy sposób?
if (!resultSet.next() ) {
System.out.println("no data");
}
Zestaw wyników nie ma metody dla hasNext. Chcę sprawdzić, czy zestaw wyników ma jakąkolwiek wartość
czy to właściwy sposób?
if (!resultSet.next() ) {
System.out.println("no data");
}
Odpowiedzi:
Zgadza się, początkowo
ResultSet
kursor wskazuje przed pierwszym wierszem, jeśli pierwsze wywołanienext()
return,false
to w danych nie było żadnych danychResultSet
.Jeśli użyjesz tej metody, być może będziesz musiał zadzwonić
beforeFirst()
natychmiast po jej zresetowaniu, ponieważ ustawiła się teraz za pierwszym rzędem.Należy jednak zauważyć, że poniższa odpowiedź Seifera jest bardziej eleganckim rozwiązaniem tego pytania.
źródło
isBeforeFirst()
aby sprawdzić, czy są zwracane wiersze bez przesuwania kursora, a następnie postępować normalnie.Zakładając, że pracujesz z nowo zwróconym,
ResultSet
którego kursor wskazuje przed pierwszym rzędem, łatwiejszym sposobem sprawdzenia tego jest po prostu wywołanieisBeforeFirst()
. Pozwala to uniknąć konieczności śledzenia wstecznego, jeśli dane mają zostać odczytane.Jak wyjaśniono w dokumentacji , zwraca wartość false, jeśli kursor nie znajduje się przed pierwszym rekordem lub jeśli nie ma wierszy w zestawie wyników .
źródło
zawsze możesz zrobić następny z góry i po prostu sprawdzić pętlę po
źródło
Zazwyczaj robiłbyś coś takiego:
Jeśli chcesz zgłosić pusty zestaw, dodaj zmienną zliczającą odczytane elementy. Jeśli potrzebujesz przeczytać tylko jeden element, Twój kod jest odpowiedni.
źródło
Aby być całkowicie pewnym, że zestaw wyników jest pusty lub nie, niezależnie od pozycji kursora, zrobiłbym coś takiego:
Ta funkcja zwróci true, jeśli ResultSet jest pusty, false, jeśli nie, lub zgłosi wyjątek SQLException, jeśli ten ResultSet jest zamknięty / niezainicjowany.
źródło
Najlepiej do tego użyć ResultSet.next () wraz ze składnią do {...} while ().
Wywołanie „Check for any results” ResultSet.next () przenosi kursor do pierwszego wiersza, więc użyj składni do {...} while (), aby przetworzyć ten wiersz, jednocześnie kontynuując przetwarzanie pozostałych wierszy zwróconych przez pętlę.
W ten sposób możesz sprawdzić wyniki, a jednocześnie przetwarzać wszystkie zwrócone wyniki.
źródło
Według najbardziej realnej odpowiedzi sugeruje się użycie „isBeforeFirst ()”. To nie jest najlepsze rozwiązanie, jeśli nie masz typu „tylko do przodu” .
Istnieje metoda o nazwie „ .first () ”. Osiągnięcie dokładnie takiego samego rezultatu jest mniej przesadne. Sprawdzasz, czy coś jest w „zestawie wyników” i nie przesuwasz kursora.
Dokumentacja stwierdza: „(...) fałsz, jeśli w zestawie wyników nie ma wierszy ”.
Istnieje jednak różnica między „isBeforeFirst ()” i „first ()”. Najpierw generuje wyjątek, jeśli jest wykonywany na zestawie wyników z typu „tylko do przodu”.
Porównaj dwie sekcje rzutów: http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#isBeforeFirst () http://docs.oracle.com/javase/7/docs /api/java/sql/ResultSet.html#first ()
Dobra, w zasadzie oznacza to, że powinieneś używać „isBeforeFirst”, o ile masz typ „tylko do przodu”. W przeciwnym razie użycie „first ()” będzie mniej przesadne.
źródło
Działa to, jeśli chcesz sprawdzić, czy w zestawie wyników są wiersze tak.
Pamiętaj, że
next()
zawsze przenosi się do następnego wiersza, więc jeśli planujesz zrobić odczyt z zestawu wyników, musisz wziąć to pod uwagę.Zwykłe użycie z ResultSet (podczas zwykłego czytania) to:
Co oczywiście nie będzie działać poprawnie, jeśli
next()
już raz wywołałeś, aby sprawdzić, czy zestaw wyników jest pusty, więc uważaj na to. Chociaż istnieją metody „tworzenia kopii zapasowych”, nie są one obsługiwane dla wszystkich typów zestawów wyników.źródło
Uważam, że jest to praktyczny i łatwy do przeczytania fragment.
źródło
isAfterLast()
zwraca również false dla pustego zestawu wyników, ale ponieważ kursor i tak jest przed pierwszym wierszem, ta metoda wydaje się bardziej przejrzysta.źródło
Ponieważ jeśli ResultSet nie ma raw, to
resultSet.first
zwraca false.źródło
Najlepiej jest sprawdzić pierwszy wiersz, aby podczas zbierania danych uniknąć błędu pomijania wiersza. Coś w stylu: if (! ResultSet.first ()) {System.out.println („brak danych”); }
źródło
Korzystając z resultSet.next (), możesz łatwo uzyskać wynik, niezależnie od tego, czy wynik zawiera dowolną wartość, czy nie
źródło
źródło
Próbowałem ustawić bieżący wiersz na pierwszy indeks (zajmujący się kluczami podstawowymi). sugerowałbym
Po wypełnieniu ResultSet wskazuje na pierwszy wiersz. Ustawienie go na pierwszy wiersz (wskazany przez
rs.absolute(1)
) spowoduje zwrócenie wartości true oznaczającej, że został on pomyślnie umieszczony w wierszu 1, lub false, jeśli wiersz nie istnieje. Możemy to ekstrapolowaćco ustawia bieżący wiersz na pozycję i i zakończy się niepowodzeniem, jeśli wiersz nie istnieje. To tylko alternatywna metoda
źródło
Utworzyłem następującą metodę, aby sprawdzić, czy zestaw wyników jest pusty.
Bardzo ważne jest, aby wziąć pod uwagę następujące kwestie:
CallableStatementObiekt musi zostać ustawiony, aby pozwolić obiektowi ResultSet przejść na koniec i wrócić na górę.
TYPE_SCROLL_SENSITIVE : Obiekt ResultSet może przesunąć się na końcu i wrócić do góry. Ponadto można złapać ostatnie zmiany.
CONCUR_READ_ONLY : Możemy odczytać dane obiektu ResultSet, ale nie możemy go zaktualizować.
źródło
Myślę, że najłatwiejszym sposobem sprawdzenia zestawu wyników jest użycie CollectionUtils w pakiecie org.apache.commons.collections.CollectionUtils
Spowoduje to sprawdzenie stanu zerowego i pustego zestawu wyników.
Więcej szczegółowych informacji można znaleźć w następującym dokumencie. CollectionUtils
źródło
Dlaczego nie użyć rs.getRow ()?
Dla mnie sprawdź „if (rs.getRow ()! = 0)” wydaje się działać dobrze.
źródło
możesz zrobić coś takiego
źródło
Lepiej jest ponownie wykonać zapytanie, ponieważ kiedy
if(rs.next()){....}
wywołamy pierwszy wiersz, zostanie wykonany wiersz ResultSet, a po nimwhile(rs.next()){....}
uzyskamy wynik z następnego wiersza. Myślę więc, że ponowne wykonanie zapytania w środkuif
jest lepszą opcją.źródło
Początkowo obiekt zestawu wyników (rs) wskazuje na BFR (przed pierwszym rekordem). Gdy użyjemy rs.next (), kursor wskazuje na pierwszy rekord, a rs przechowuje „true”. Za pomocą pętli while można wydrukować wszystkie rekordy tabeli. Po pobraniu wszystkich rekordów kursor przesuwa się do ALR (po ostatnim rekordzie) i zostanie ustawiony na zero. Rozważmy, że w tabeli są 2 rekordy.
Krótko mówiąc, możemy również napisać warunek jako while (rs.next ()).
źródło