2010-03-30 11 views
5

Wie kann ich ResultSet iterieren? Ich habe mit dem folgenden Code versucht, aber ich bekomme den Fehler java.sql.SQLException: Ungültige Operation auf leere Ergebnismenge.Problem mit SQL, ResultSet in Java

while (!rs.isLast()) { 
    rs.next(); 
    int id = rs.getInt("person_id"); 
    SQL.getInstance().getSt().execute("INSERT ref_person_pub(person_id) VALUES(" + id + ")"); 
} 

Update: Ich habe das Problem gefunden. Ich habe nur eine Anweisung vom SQL-Singleton verwendet. Wenn die Anweisung geschlossen wird, kann sie nicht erneut verwendet werden.

Antwort

11

Gemäß der JDBC tutorial:

resultSet = statement.executeQuery(); 
while (resultSet.next()) { 
    int id = resultSet.getInt("id"); 
    // ... 
} 

Die ResultSet#next() bewegt den Cursor nach vorne eine Zeile von seiner aktuellen Position und gibt true, wenn die neue aktuelle Zeile gültig ist. Daher wird die Schleife while automatisch angehalten, wenn keine weiteren Zeilen vorhanden sind.

Wenn wird angenommen, Null oder eine Zeile anstelle von mehreren Zeilen zurückgeben, dann eher verwenden if statt:

resultSet = statement.executeQuery(); 
if (resultSet.next()) { 
    int id = resultSet.getInt("id"); 
    // ... 
} 

diese Weise können Sie die Möglichkeit haben, eine else hinzuzufügen.

Update, das sagte und nicht mit dem eigentlichen Problem verbunden ist, sehe ich mehr potenzielle Probleme in Ihrem Code: Erstens scheinen Sie mehrere Abfragen abzufeuern, die voneinander abhängig sind. Dies kann effizienter durchgeführt werden. Kennen Sie sich mit ? Zweitens, lebst du nicht JDBC-Ressourcen? Es sieht so aus, als ob Sie eine Aussage erhalten, aber keine Handhabe dafür bekommen, dass Sie sie nach Gebrauch richtig schließen können. Bitte konsultieren Sie das vorher verlinkte JDBC-Tutorial für eine grundlegende Erklärung, wie man mit JDBC-Code richtig arbeitet und this article für einige grundlegende Kickoff-Beispiele, wie man JDBC richtig verwendet. Andernfalls kann die Anwendung früher oder später abstürzen, wenn der Datenbank die Ressourcen ausgehen.

+0

Wenn ich versuche, rs.next() in der while-Anweisung zu verwenden, bekomme ich den gleichen Fehler. – aphex

+0

Sie können unmöglich 'Ungültige Operation auf leere Ergebnismenge' erhalten, wenn Sie 'next()' auf einem frisch erworbenen Resultset aufrufen. Also liegt dein Problem woanders. Entweder greifen Sie auf die falsche Ergebnismenge zu oder Sie interpretieren die Ausnahme und/oder die Codezeile, an der sie verursacht wurde, falsch. – BalusC

+0

Wenn 'getSt' (ich schlage vor, vollständige Wörter zu verwenden) gibt die gleiche' Anweisung' zurück, dann ist es kein Leck. Mein JDBC ist sehr rostig, darf man einen Iterator weiter benutzen, während man eine andere Aussage über die "Aussage" ausführt (schlechte Analogie: eine Sammlung mutieren, während man darüber iteriert)? Wie auch immer, benutze 'PreparedStatement' anstatt dynamisches SQL. Edit: Zweite Zeile der 'Statement'-API-Dokumentation:" Standardmäßig kann nur ein ResultSet-Objekt pro Statement-Objekt gleichzeitig geöffnet sein. " –

2
while(rs.next()) { 
    // iterate 
}