Was bedeutet "if (rs.next ())"?

8

Ich erhalte derzeit den Fehler

%Vor%

weil ich

verwende %Vor%

und hatte auch

%Vor%

in meinem Code.

Ich muss jetzt die ResultSet-Zeile entfernen, aber das lässt mich mit dem folgenden Code umgehen:

%Vor%

Ich bin mir nicht sicher, ob ich komplett verstehe was

%Vor%

tut es. Kann mir jemand diesen Code erklären? Wenn ich ein besseres Verständnis davon habe, glaube ich, dass ich eine bessere Idee habe, wie ich mit den PreparedStatement-Ergebnissen mit der für rs verwendeten Logik umgehen kann. Auch jede Hilfe, die sich mit der Änderung dieser Logik beschäftigt, wäre sehr willkommen.

    
Turk 20.11.2011, 04:25
quelle

7 Antworten

6

Was das konkrete Problem mit SQLException betrifft, müssen Sie

ersetzen %Vor%

von

%Vor%

, weil Sie stattdessen die PreparedStatement Unterklasse verwenden von Statement . Wenn Sie PreparedStatement verwenden, haben Sie die SQL-Zeichenfolge bereits an Connection#prepareStatement() übergeben. Sie müssen nur die Parameter festlegen und dann executeQuery() method direkt aufrufen, ohne die SQL-Zeichenfolge erneut zu übergeben.

Siehe auch:

Was die konkrete Frage zu rs.next() betrifft, verschiebt es den Cursor auf die nächste Zeile der Ergebnismenge aus der Datenbank und gibt true zurück, wenn eine Zeile vorhanden ist, andernfalls false . In Kombination mit der if -Anweisung (anstelle von while ) bedeutet dies, dass der Programmierer nur eine Zeile, die erste Zeile, erwartet oder interessiert.

Siehe auch:

BalusC 20.11.2011, 04:29
quelle
3

Ich nehme an, dass Sie Java 6 verwenden und dass das von Ihnen verwendete ResultSet ein java.sql.ResultSet ist.

Das JavaDoc für das ResultSet.next () Methode heißt:

  

Bewegt den Cursor um eine Zeile von seiner aktuellen Position. Ein ResultSet-Cursor wird anfänglich vor der ersten Zeile positioniert. der erste Aufruf der Methode macht die erste Zeile zur aktuellen Zeile; Der zweite Aufruf macht die zweite Zeile zur aktuellen Zeile und so weiter.

     

Wenn ein Aufruf der nächsten Methode false zurückgibt, wird der Cursor nach der letzten Zeile positioniert. Jeder Aufruf einer ResultSet-Methode, die eine aktuelle Zeile erfordert, führt dazu, dass eine SQLException ausgelöst wird.

Also bedeutet if(rs.next(){ //do something } "Wenn die Ergebnismenge noch Ergebnisse enthält, gehen Sie zum nächsten Ergebnis und machen Sie etwas".

Wie BalusC darauf hingewiesen hat , müssen Sie ersetzen

%Vor%

mit

%Vor%

Weil Sie bereits festgelegt haben, dass das SQL in der Anweisung mit Ihrer vorherigen Zeile verwendet werden soll

%Vor%

Wenn Sie PreparedStatement nicht verwenden, funktioniert ResultSet rs = stmt.executeQuery(sql); .

    
chrisbunney 20.11.2011 04:35
quelle
2

Die Methode next() (offizielles Dokument hier ) verschiebe einfach den Zeiger der Ergebniszeilen auf die nächste Zeile (wenn es möglich ist). Jedenfalls kannst du das auch vom offiziellen Doc lesen:

  

Bewegt den Cursor eine Zeile von seiner aktuellen Position nach unten.

Diese Methode gibt true zurück, wenn es eine andere Zeile gibt oder andernfalls false.

    
Aurelio De Rosa 20.11.2011 04:28
quelle
2

Der next() bewegt den Cursor um eine Zeile von seiner aktuellen Position in resultset . Es ist also offensichtlich, dass if(rs.next()) bedeutet, dass, wenn die nächste Zeile nicht null ist (bedeutet, wenn sie existiert), Go Ahead .

Jetzt w.r.t Ihr Problem,

%Vor%

Beachten Sie Folgendes: executeQuery (String) wird verwendet, wenn Sie eine SQL-Abfrage als String verwenden.

Wenn Sie PreparedStatement verwenden, verwenden Sie < a href="http://download.oracle.com/javase/1.4.2/docs/api/java/sql/PreparedStatement.html#executeQuery%28%29"> executeQuery () , das das SQL ausführt Abfrage in diesem PreparedStatement -Objekt und gibt das von der Abfrage generierte ResultSet -Objekt zurück.

Lösung:

Verwenden Sie: ResultSet rs = stmt.executeQuery();

    
COD3BOY 20.11.2011 04:31
quelle
0

Sehen Sie sich das Bild an, es ist eine Ergebnismenge einer Abfrage. Wählen Sie * von Mitarbeiter

und die next () -Methode der ResultSet-Klasse helfen, den Cursor in die nächste Zeile einer zurückgegebenen Ergebnismenge zu verschieben, die in Ihrem Beispiel rs ist.

:)

    
alibenmessaoud 20.11.2011 04:31
quelle
0

Da Result Set eine Schnittstelle ist, erhalten Sie eine Instanz einer Klasse, die die ResultSet-Schnittstelle implementiert, wenn Sie über einen JDBC-Aufruf eine Referenz auf ein ResultSet erhalten. Diese Klasse bietet konkrete Implementierungen aller ResultSet-Methoden.

Schnittstellen werden verwendet, um die Implementierung von, gut, Schnittstelle zu trennen. Dies ermöglicht die Erstellung generischer Algorithmen und die Abstraktion der Objekterstellung. Beispielsweise geben JDBC-Treiber für verschiedene Datenbanken unterschiedliche ResultSet-Implementierungen zurück, aber Sie müssen Ihren Code nicht ändern, damit er mit den verschiedenen Treibern funktioniert.

Sehr kurz, wenn Ihr ResultSet result enthält, geben Sie mit rs.next true zurück, wenn Sie einen Recordset haben, ansonsten gibt es false zurück.

    
Robin 20.11.2011 04:32
quelle
0

Zuerst müssen Sie nicht schreiben

%Vor%

schreibe einfach

%Vor%

Die oben genannte Syntax wird für Anweisungen nicht für PreparedStatement verwendet.

Zweitens überprüft rs.next (), ob die Ergebnismenge irgendwelche Werte enthält oder nicht. Er gibt einen booleschen Wert zurück und verschiebt den Cursor auf den ersten Wert in der Ergebnismenge, da er sich anfänglich an der Position VOR der ersten Position befindet. Wenn Sie also auf den ersten Wert in der Ergebnismenge zugreifen möchten, müssen Sie rs.next () schreiben.

    
gprathour 20.11.2011 04:33
quelle