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łanie next()
return, false
to w danych nie było żadnych danych ResultSet
.
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.
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łanie isBeforeFirst()
. 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 .
if (!resultSet.isBeforeFirst() ) {
System.out.println("No data");
}
Zazwyczaj robiłbyś coś takiego:
while ( resultSet.next() ) {
// Read the next item
resultSet.getString("columnName");
}
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.
Aby być całkowicie pewnym, że zestaw wyników jest pusty lub nie, niezależnie od pozycji kursora, zrobiłbym coś takiego:
public static boolean isMyResultSetEmpty(ResultSet rs) throws SQLException {
return (!rs.isBeforeFirst() && rs.getRow() == 0);
}
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.
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.
if(resultSet.next()) { // Checks for any results and moves cursor to first row,
do { // Use 'do...while' to process the first row, while continuing to process remaining rows
} while (resultSet.next());
}
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 ”.
if(rs.first()){
//do stuff
}
Możesz także wywołać metodę isBeforeFirst (), aby sprawdzić, czy są zwracane wiersze bez przesuwania kursora, a następnie postępować normalnie. - SnakeDoc, 2 września 14 o 19:00
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.
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:
while (resultSet.next())
{
... read from the row here ...
}
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.
if (!resultSet.isAfterLast() ) {
System.out.println("No data");
}
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.
if(resultSet.first) {
} else {
system.out.println("No raw or resultSet is empty");
}
Ponieważ jeśli ResultSet nie ma raw, to resultSet.first
zwraca false.
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”); }
Korzystając z resultSet.next (), możesz łatwo uzyskać wynik, niezależnie od tego, czy wynik zawiera dowolną wartość, czy nie
ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet.next())
//resultSet contain some values
else
// empty resultSet
ResultSet result = stmt.executeQuery(sqlQuery);
if (!result.next())
status = "ERROR";
else
status = "SUCCESS";
Próbowałem ustawić bieżący wiersz na pierwszy indeks (zajmujący się kluczami podstawowymi). sugerowałbym
if(rs.absolute(1)){
System.out.println("We have data");
} else {
System.out.println("No data");
}
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ć
for(int i=1; rs.absolute(i); i++){
//Code
}
co ustawia bieżący wiersz na pozycję i i zakończy się niepowodzeniem, jeśli wiersz nie istnieje. To tylko alternatywna metoda
while(rs.next()){
//Code
}
Utworzyłem następującą metodę, aby sprawdzić, czy zestaw wyników jest pusty.
public static boolean resultSetIsEmpty(ResultSet rs){
try {
// We point the last row
rs.last();
int rsRows=rs.getRow(); // get last row number
if (rsRows == 0) {
return true;
}
// It is necessary to back to top the pointer, so we can see all rows in our ResultSet object.
rs.beforeFirst();
return false;
}catch(SQLException ex){
return true;
}
}
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ć.
CallableStatement proc = dbconex.prepareCall(select, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
Myślę, że najłatwiejszym sposobem sprawdzenia zestawu wyników jest użycie CollectionUtils w pakiecie org.apache.commons.collections.CollectionUtils
if(CollectionUtils.isNotEmpty(resultList)){
/**
* do some stuff
*/
}
Spowoduje to sprawdzenie stanu zerowego i pustego zestawu wyników.
Więcej szczegółowych informacji można znaleźć w następującym dokumencie. CollectionUtils
Dlaczego nie użyć rs.getRow ()?
int getRow()
throws SQLException
Retrieves the current row number. The first row is number 1, the second number 2, and so on.
Note:Support for the getRow method is optional for ResultSets with a result set type of TYPE_FORWARD_ONLY
Returns:
the current row number; 0 if there is no current row
Throws:
SQLException - if a database access error occurs or this method is called on a closed result set
SQLFeatureNotSupportedException - if the JDBC driver does not support this method
Since:
1.2
Dla mnie sprawdź „if (rs.getRow ()! = 0)” wydaje się działać dobrze.
możesz zrobić coś takiego
boolean found = false;
while ( resultSet.next() )
{
found = true;
resultSet.getString("column_name");
}
if (!found)
System.out.println("No Data");
ResultSet rs = rs.executeQuery();
if(rs.next())
{
rs = rs.executeQuery();
while(rs.next())
{
//do code part
}
}
else
{
//else if no result set
}
Lepiej jest ponownie wykonać zapytanie, ponieważ kiedy if(rs.next()){....}
wywołamy pierwszy wiersz, zostanie wykonany wiersz ResultSet, a po nim while(rs.next()){....}
uzyskamy wynik z następnego wiersza. Myślę więc, że ponowne wykonanie zapytania w środku if
jest lepszą opcją.
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.
if(rs.next()==false){
// there are no records found
}
while (rs.next()==true){
// print all the records of the table
}
Krótko mówiąc, możemy również napisać warunek jako while (rs.next ()).