web-dev-qa-db-de.com

Java ResultSet, wie geprüft werden soll, ob Ergebnisse vorliegen

Resultset hat keine Methode für hasNext. Ich möchte überprüfen, ob das resultSet einen Wert hat

ist das der richtige Weg?

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

Das ist richtig, anfangs zeigt der Cursor des ResultSet vor der ersten Zeile. Wenn der erste Aufruf von next()false zurückgibt, waren keine Daten im ResultSet ] _.

Wenn Sie diese Methode verwenden, müssen Sie beforeFirst() möglicherweise sofort aufrufen, um es zurückzusetzen, da es sich jetzt hinter der ersten Zeile positioniert hat.

Es sollte jedoch beachtet werden, dass Seifers Antwort unten eine elegantere Lösung für diese Frage ist.

226
ninesided

Angenommen, Sie arbeiten mit einem neu zurückgegebenen ResultSet, dessen Cursor vor der ersten Zeile steht, dann können Sie dies am einfachsten überprüfen, indem Sie isBeforeFirst() aufrufen. Dies vermeidet das Zurückverfolgen, wenn die Daten gelesen werden sollen.

Wie in der Dokumentation erläutert gibt false zurück, wenn der Cursor nicht vor dem ersten Datensatz steht oder wenn keine Zeilen im ResultSet vorhanden sind .

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

504
Seifer

sie könnten immer die nächste Prüfung durchführen und einfach einen Post-Loop-Check durchführen

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

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

Normalerweise würden Sie so etwas tun:

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

Wenn Sie einen leeren Satz melden möchten, fügen Sie eine Variable hinzu, die die gelesenen Elemente zählt. Wenn Sie nur einen Artikel lesen müssen, ist Ihr Code ausreichend.

19
kgiannakakis

Um sicherzugehen, dass die Ergebnismenge unabhängig von der Cursorposition leer oder nicht leer ist, würde ich Folgendes tun:

public static boolean isMyResultSetEmpty(ResultSet rs) throws SQLException {
    return (!rs.isBeforeFirst() && rs.getRow() == 0);
}

Diese Funktion gibt true zurück, wenn ResultSet leer ist, false, wenn nicht, oder löst eine SQLException aus, wenn ResultSet geschlossen/nicht initialisiert ist.

11
Felype

Verwenden Sie dazu am besten ResultSet.next () zusammen mit der Syntax do {...} while ().

Der "Check for any results" -Aufruf ResultSet.next () bewegt den Cursor in die erste Zeile. Verwenden Sie also die Syntax do {...} while (), um diese Zeile zu verarbeiten, während Sie die von der Schleife zurückgegebenen verbleibenden Zeilen weiter verarbeiten.

Auf diese Weise können Sie nach Ergebnissen suchen und gleichzeitig die zurückgegebenen Ergebnisse verarbeiten.

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());
}
8
Dermot Doherty

Nach der sinnvollsten Antwort lautet der Vorschlag "isBeforeFirst ()". Das ist nicht die beste Lösung, wenn Sie keinen "forward only type" haben.

Es gibt eine Methode namens " . First () ". Es ist weniger übertrieben, um genau das gleiche Ergebnis zu erzielen. Sie überprüfen, ob etwas in Ihrer "Ergebnismenge" enthalten ist, und bewegen den Cursor nicht weiter.

In der Dokumentation heißt es: "(...) false, wenn die Ergebnismenge keine Zeilen enthält".

if(rs.first()){
    //do stuff      
}

Sie können auch einfach isBeforeFirst () aufrufen, um zu testen, ob Zeilen zurückgegeben werden, ohne den Cursor zu bewegen, und dann normal fortfahren. - SnakeDoc 2. September 14 um 19:00 Uhr

Es gibt jedoch einen Unterschied zwischen "isBeforeFirst ()" und "first ()". Erzeugt zuerst eine Ausnahme, wenn dies für eine Ergebnismenge vom Typ "nur vorwärts" durchgeführt wird.

Vergleichen Sie die beiden Throw-Abschnitte: 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()

Okay, im Grunde bedeutet dies, dass Sie "isBeforeFirst" verwenden sollten, solange Sie einen "forward only" -Typ haben. Andernfalls ist es weniger übertrieben, "first ()" zu verwenden.

8
OddDev

Dies ist ein praktisches und leicht lesbares Stück, das ich glaube.

        if (res.next()) {
            do {

                // successfully in. do the right things.

            } while (res.next());
        } else {
           // no results back. warn the user.
        }
5
JSBach

Das würde funktionieren, wenn Sie sehen möchten, ob die Ergebnismenge ja Zeilen enthält.

Beachten Sie, dass next() immer in die nächste Zeile wechselt. Wenn Sie also vorhaben, aus der Ergebnismenge etwas zu lesen, müssen Sie dies berücksichtigen.

Die übliche Verwendung mit ResultSet (beim einfachen Lesen) ist:

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

Was offensichtlich nicht richtig funktioniert, wenn Sie next() bereits einmal aufgerufen haben, um zu überprüfen, ob die Ergebnismenge leer war. Achten Sie also darauf. Es gibt zwar Methoden zum "Sichern", diese werden jedoch nicht für alle Arten von Ergebnismengen unterstützt.

5
Nuoji
if (!resultSet.isAfterLast() ) {    
System.out.println("No data"); 
} 

isAfterLast() gibt auch false für leere Ergebnismenge zurück, aber da der Cursor sowieso vor der ersten Zeile steht, scheint diese Methode klarer zu sein.

2
Nick Warke

Am besten überprüfen Sie die erste Zeile, damit Sie beim Abrufen der Daten den Fehler vermeiden können, eine Zeile zu überspringen. So etwas wie: if (! ResultSet.first ()) {System.out.println ("keine Daten"); }

1
Anthony Oyovwe
if(resultSet.first) {

} else { 
    system.out.println("No raw or resultSet is empty");
}

Denn wenn ResultSet kein RAW hat, dann resultSet.first gibt false zurück.

1
user868927

Ich habe die folgende Methode erstellt, um zu überprüfen, ob ein ResultSet leer ist.

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;
    }
}

Es ist sehr wichtig, die folgenden Überlegungen zu haben:

CallableStatement Objekt muss gesetzt sein, damit das ResultSet-Objekt am Ende und nach oben geht.

TYPE_SCROLL_SENSITIVE: ResultSet-Objekt kann sich am Ende verschieben und nach oben springen. Weitere können letzte Änderungen fangen.

CONCUR_READ_ONLY: Wir können die ResultSet-Objektdaten lesen, aber nicht aktualisieren.

CallableStatement proc = dbconex.prepareCall(select, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
1
Cristian

Mit resultSet.next () können Sie auf einfache Weise das Ergebnis abrufen, unabhängig davon, ob resultSet einen Wert enthält oder nicht

ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet.next())
 //resultSet contain some values
else
 // empty resultSet
1
Ram72119
ResultSet result = stmt.executeQuery(sqlQuery);
if (!result.next())
    status = "ERROR";
else
    status = "SUCCESS";
1
Deepu Surendran
ResultSet rs = rs.executeQuery();
if(rs.next())
{
  rs = rs.executeQuery();
  while(rs.next())
  {
    //do code part
  }
}
else
{
  //else if no result set
}

Es ist besser, die Abfrage erneut auszuführen, da beim Aufruf von if(rs.next()){....} die erste Zeile von ResultSet ausgeführt wird und danach in while(rs.next()){....} das Ergebnis aus der nächsten Zeile ausgegeben wird. Daher denke ich, dass eine erneute Ausführung der Abfrage in if die bessere Option ist.

0
Arpit Trivedi

Ich habe versucht, die aktuelle Zeile auf den ersten Index zu setzen (mit Primärschlüsseln). ich würde vorschlagen

if(rs.absolute(1)){
    System.out.println("We have data");
} else {
    System.out.println("No data");
}

Wenn das ResultSet gefüllt ist, zeigt es auf vor der ersten Zeile. Wenn es auf die erste Zeile gesetzt wird (angezeigt durch rs.absolute(1)), gibt es true zurück, um anzuzeigen, dass es erfolgreich in Zeile 1 platziert wurde, oder false, wenn die Zeile nicht vorhanden ist. Wir können dies auf extrapolieren

for(int i=1; rs.absolute(i); i++){
    //Code
}

das setzt die aktuelle Zeile auf Position i und schlägt fehl, wenn die Zeile nicht existiert. Dies ist nur eine alternative Methode zu

while(rs.next()){
    //Code
}
0
Andrew

Warum nicht rs.getRow () verwenden?

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

Für mich überprüfen "ob (rs.getRow ()! = 0)" scheint gut zu funktionieren.

0
stiebrs

sie können so etwas tun

boolean found = false;

while ( resultSet.next() )
{
    found = true;
    resultSet.getString("column_name");
}

if (!found)
    System.out.println("No Data");
0

Ich denke, der einfachste Weg, die Ergebnismenge zu überprüfen, ist über CollectionUtils unter package org.Apache.commons.collections.CollectionUtils

if(CollectionUtils.isNotEmpty(resultList)){
  /**
  * do some stuff
  */
}

Dadurch wird geprüft, ob die Bedingung für die Ergebnismenge null oder leer ist.

Weitere Informationen finden Sie im folgenden Dokument. CollectionUtils

0