2010-03-30 16 views
5

Jak mogę iterować ResultSet? Próbowałem z następującym kodem, ale pojawia się błąd java.sql.SQLException: Nielegalna operacja na pustym zestawie wyników.Problem z SQL, ResultSet w java

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

Aktualizacja: Znalazłem problem. Użyłem tylko jednej instrukcji z singletonu SQL. Gdy instrukcja jest zamknięta, nie można jej użyć ponownie.

Odpowiedz

11

Zgodnie z JDBC tutorial:

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

W ResultSet#next() przemieszcza się kursor jednym wierszu od aktualnej pozycji i zwraca true jeśli nowa rząd prąd jest ważny. W związku z tym pętla while zatrzyma się automatycznie, gdy nie będzie już żadnych wierszy.

Jeśli to ma powrócić zero lub jeden wiersz zamiast wielu wierszy, wtedy raczej używać if zamiast:

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

ten sposób masz możliwość dodania się else.

Aktualizacja, że powiedział i niezwiązane z rzeczywistym problemem, widzę więcej potencjalnych problemów w kodzie: po pierwsze, wydaje się ognia wielu zapytań, które są od siebie zależne. Można to zrobić bardziej wydajnie. Czy znasz SQL Joins? Po drugie, czy nie przeciekasz zasobów JDBC? Wygląda na to, że nabywasz oświadczenie, ale nie uzyskujesz go, aby można go było zamknąć po użyciu. Zapoznaj się z wcześniej połączonym samouczkiem JDBC, aby uzyskać podstawowe wyjaśnienie, jak poprawnie pracować z kodem JDBC i this article, aby zapoznać się z kilkoma podstawowymi przykładami kickoffów, jak poprawnie używać JDBC. W przeciwnym razie aplikacja może się wcześniej czy później zepsuć, gdy w bazie danych zabraknie zasobów.

+0

Kiedy próbuję użyć rs.next() w instrukcji while, pojawia się ten sam błąd. – aphex

+0

Możesz niemożliwie uzyskać 'Nielegalne działanie na pustym zestawie wyników' podczas wywoływania' next() 'na świeżo uzyskanym zestawie wyników. Więc twój problem leży gdzie indziej. Albo uzyskujesz dostęp do niewłaściwego zestawu wyników lub źle interpretujesz wyjątek i/lub linię kodu, w której zostały spowodowane. – BalusC

+0

Jeśli 'getSt' (sugeruję użycie pełnych słów) zwraca to samo' Statement', to nie jest przeciek. Moje JDBC jest bardzo zardzewiałe, czy wolno ci dalej używać iteratora podczas wykonywania innego stwierdzenia na 'Statement' (zła analogia: mutowanie kolekcji podczas iteracji nad nią)? W każdym razie użyj raczej 'PreparedStatement' niż dynamicznego SQL. Edycja: Drugi wiersz dokumentów API "Statement": "Domyślnie tylko jeden obiekt ResultSet na obiekt Statement może być otwarty w tym samym czasie." –

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