2017-05-20 3 views
0

Dies ist ein einfacher Code, der einige Zeilen aus einer Datenbank druckt. Aber wenn ich dies ausführe, wird nichts auf dem Bildschirm gedruckt. Ich dachte, dass das Problem rs.next() Methode ist, überspringt eine Zeile. Wie kann ich das vermeiden oder die Position der rs.next() Methode zurücksetzen?Vermeiden des Überspringens einer Zeile By next() Methode des ResultSet

String searchword = Searchtf.getText(); 
try { 
     Class.forName("com.mysql.jdbc.Driver"); 

     java.sql.Connection con = DriverManager.getConnection(url, db_username, db_password); 

     java.sql.Statement stat = con.createStatement(); 

     String searchQuery = "SELECT * FROM user WHERE Name LIKE '" + searchword + "' "; 

java.sql.ResultSet rs = stat.executeQuery(searchQuery); 

     if (rs.next()) { 
      while (rs.next()) { 
       System.out.print(rs.getString("idUser") + " ,"); 
       System.out.print(rs.getString("Name") + " ,"); 
       System.out.print(rs.getString("Email") + " ,"); 
       System.out.println(rs.getString("country") + " ."); 
      } 
     } else { 
      JOptionPane.showMessageDialog(null, "Not Found"); 
     } 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
+0

Mögliche Duplikat [Java ResultSet, wie wenn es irgendwelche Ergebnisse zu überprüfen] (http://stackoverflow.com/questions/867194/java-resultset-how-to-check-if-there-are -any-results) –

Antwort

3

Zuerst stoppen SQL Aufbau ähnlich - verwenden parametrisierte SQL und PreparedStatement. Ihr aktueller Code ist anfällig für SQL-Injection-Angriffe.

Grundsätzlich nicht rs.next() zweimal hintereinander anrufen (zuerst in den if dann im while) ... Sie können ganz einfach tun, dass Ihre while Schleife in eine do/while Schleife durch Umwandlung:

if (rs.next()) { 
    do { 
     System.out.print(rs.getString("idUser") + " ,"); 
     System.out.print(rs.getString("Name") + " ,"); 
     System.out.print(rs.getString("Email") + " ,"); 
     System.out.println(rs.getString("country") + " ."); 
    } while (rs.next()); 
} 

oder nur haben die while Schleife, mit einer separaten Variable zu erkennen, dass Sie einige Ergebnisse gesehen haben:

bool anyResults = false; 
while (rs.next()) { 
    anyResults = true; 
    System.out.print(rs.getString("idUser") + " ,"); 
    System.out.print(rs.getString("Name") + " ,"); 
    System.out.print(rs.getString("Email") + " ,"); 
    System.out.println(rs.getString("country") + " ."); 
} 
if (!anyResults) { 
    JOptionPane.showMessageDialog(null, "Not Found"); 
} 

(Zusätzlich sollten Sie versuchen-mit-Ressourcen Ihre ResultSet usw. zu schließen, und nur einen Stack-Trace auf stdout Druck so gut wie nie der richtige Weg ist, um Ausnahmen zu behandeln ...)

+0

Vielen Dank für Ihre Antwort .. Nun, ich werde parametrisierte SQL und eine PreparedStatement in meine Zukunft Codes verwenden. 'rs.relative (-1)' ist auch für mich gearbeitet! Ich habe es überprüft – Nazeer

+2

@Nazeer: Nein, beheben Sie Ihren * aktuellen * Code. Sie haben eine Sicherheitslücke. Zu sagen "Ich mache es gleich beim nächsten Mal" ist dafür nicht gut genug. Es ist wirklich, wirklich, wirklich wichtig, sich die Angewohnheit zu nehmen, sich vor der SQL-Injektion zu schützen, und es gibt keine bessere Zeit, als jetzt anzufangen. –

+0

Nun, danke .. Ich habe keine sehr gute Kenntnisse in parametrisierten SQL und einem PreparedStatement. Ich werde es jetzt lernen. – Nazeer

0

Nein keine Notwendigkeit zu verwenden, :

if (rs.next()) { 

Die while ist genug, das macht das Ergebnis zwei Mal. stattdessen können Sie:

boolean b = false; 
while (rs.next()) { 
    b = true; 
    ... 
} 

if(!b) { 
    JOptionPane.showMessageDialog(null, "Not Found"); 
} 

Sie haben PreparedStatement stattdessen zu verwenden, beliebige SQL-Injection oder Syntaxfehler zu vermeiden.

+0

Ohne die 'if' Anweisung, wie würdest du mit dem' else' umgehen? Es gibt Optionen (gemäß meiner Antwort), aber Sie erkennen es nicht als etwas an, das in Ihrer Antwort behandelt werden soll. –

+0

das OP kann einen boolean innerhalb der while verwenden, um zu wissen, ob es Ergebnisse gibt oder nicht @ JonSkeet –

+0

Richtig, also zeigen Sie das in der Antwort an. Mein Punkt ist, dass sie nicht einfach die 'if'-Anweisung entfernen können, wie Ihre Antwort impliziert. –

-2

Hey es ist Zeile überspringen, weil Sie rs.next() in der if-Klausel und dann wieder in während. Die erste Iteration, die gerade ausgeführt wird, ist tatsächlich die zweite Zeile. Die beste Option wird in, wenn Klausel u schreiben sollte, wenn (rs.first())

+0

Das würde für ein forward-only "ResultSet" fehlschlagen, und wenn es gelingt, würde es * noch * die erste Zeile überspringen, da auf den Aufruf von 'first()' ein Aufruf folgen würde 'next()'. Es ist einfacher, nur sicherzustellen, dass "nächste" nur die richtige Anzahl von Malen aufgerufen wird - siehe meine Antwort für zwei Optionen. –

0

rs.next() wird in if Cursor erhöhen so, wenn resultset nur eine Zeile hat durch Abfrage zurückgegeben, dann wird while Cursor wieder und es werden keine Daten drucken erhalten .Verwenden Sie stattdessen die do..while Schleife.

if (rs.next()) { 
      do { 
       System.out.print(rs.getString("idUser") + " ,"); 
       System.out.print(rs.getString("Name") + " ,"); 
       System.out.print(rs.getString("Email") + " ,"); 
       System.out.println(rs.getString("country") + " ."); 
      }while (rs.next()); 
     } 
0

Danke für jede Antwort. Ich fand, dass Putting rs.relative(-1) auch die Arbeit macht. Aber die obigen Antworten sind gut codiert und besser als meine. Also danke allen. Ich bin ein Neuling für die Programmierung Ich werde alle Ihre Ratschläge in meiner Codierung berücksichtigen. Dank

if (rs.next()) { 
    rs.relative(-1); 
     while (rs.next()) { 
      System.out.print(rs.getString("idUser") + " ,"); 
      System.out.print(rs.getString("Name") + " ,"); 
      System.out.print(rs.getString("Email") + " ,"); 
      System.out.println(rs.getString("country") + " ."); 
     } 
} 
+1

'relative (-1)' wird nicht immer funktionieren, zum Beispiel wird es nicht mit einem 'TYPE_FORWARD_ONLY' Ergebnissatz funktionieren, der normalerweise der Standardwert ist. –

+0

ja ich habe es herausgefunden! Dank bro – Nazeer

Verwandte Themen