2010-03-30 4 views
5

Comment puis-je itérer ResultSet? J'ai essayé avec le code suivant, mais j'obtiens l'erreur java.sql.SQLException: Opération illégale sur l'ensemble de résultats vide.Problème avec SQL, ResultSet dans Java

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

Mise à jour: J'ai trouvé le problème. J'ai utilisé seulement une déclaration du singleton SQL. Lorsque l'instruction est fermée, elle ne peut plus être utilisée.

Répondre

11

Selon la JDBC tutorial:

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

Les ResultSet#next() déplace le curseur en avant d'une ligne à partir de sa position actuelle et renvoie true si la nouvelle ligne courante est valide. Ainsi, la boucle while s'arrêtera automatiquement lorsqu'il n'y aura plus de lignes.

S'il est censé revenir à zéro ou une ligne au lieu de plusieurs lignes, puis plutôt utiliser if à la place:

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

De cette façon, vous avez la possibilité d'ajouter un else.

Mise à jour, cela dit et sans rapport avec le problème réel, je vois plus de problèmes potentiels dans votre code: d'abord, vous semblez déclencher plusieurs requêtes qui dépendent l'une de l'autre. Cela peut être fait plus efficace. Connaissez-vous SQL Joins? Deuxièmement, ne fuyez-vous pas les ressources de JDBC? Il semblerait que vous acquérez une déclaration, mais que vous ne la maîtrisiez pas de manière à pouvoir la fermer correctement après utilisation. S'il vous plaît consulter le tutoriel JDBC avant lié pour une explication de base sur la façon de travailler correctement avec le code JDBC et this article pour plusieurs exemples de base de démarrage comment utiliser correctement JDBC. Sinon, votre application peut tomber en panne tôt ou tard lorsque le DB manque de ressources.

+0

Lorsque j'essaie d'utiliser rs.next() dans l'instruction while, j'obtiens la même erreur. – aphex

+0

Il est impossible d'obtenir 'Opération illégale sur un ensemble de résultats vide' lorsque vous appelez' next() 'sur un jeu de résultats fraîchement acquis. Donc, votre problème se situe ailleurs. Soit vous accédez au mauvais jeu de résultats, soit vous interprétez mal l'exception et/ou la ligne de code où elle a été provoquée. – BalusC

+0

Si 'getSt' (je suggère d'utiliser des mots entiers) renvoie le même' Statement', ce n'est pas une fuite. Mon JDBC est très rouillé, êtes-vous autorisé à continuer à utiliser un itérateur lors de l'exécution d'une autre instruction sur le 'Statement' (mauvaise analogie: mutation d'une collection lors de l'itération)? Quoi qu'il en soit, utilisez un 'PreparedStatement' plutôt qu'un SQL dynamique. Edit: Deuxième ligne des docs d'API 'Statement':" Par défaut, un seul objet ResultSet par objet Statement peut être ouvert en même temps. " –

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