2010-03-30 18 views
5

Come posso ripetere ResultSet? Ho provato con il seguente codice, ma ottengo l'errore java.sql.SQLException: operazione non valida sul set di risultati vuoto.Problema con 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 + ")"); 
} 

Aggiornamento: ho trovato il problema. Ho usato solo una dichiarazione dal singleton SQL. Quando la dichiarazione è chiusa, non può essere riutilizzata.

risposta

11

Come per il JDBC tutorial:

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

I ResultSet#next() sposta il cursore avanti di una riga dalla sua posizione corrente e restituisce true se la nuova riga corrente è valido. Pertanto, il ciclo while si arresterà automaticamente quando non ci sono più righe.

Se si deve restituire zero o una riga invece di più righe, allora piuttosto utilizzare if invece:

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

In questo modo si ha la possibilità di aggiungere un else.

Aggiornamento, che detto e non correlato al problema attuale, vedo più potenziali problemi nel codice: in primo luogo, sembra che si attivino più query che dipendono l'una dall'altra. Questo può essere fatto più efficiente. Conosciamo SQL Joins? Secondo, non stai perdendo risorse JDBC? Sembra che tu stia acquisendo una dichiarazione, ma non riesci a gestirla in modo da poterla chiudere correttamente dopo l'uso. Consulta la precedente esercitazione JDBC collegata per una spiegazione di base su come lavorare correttamente con il codice JDBC e this article per diversi esempi di kickoff di base su come utilizzare correttamente JDBC. In caso contrario, la tua applicazione potrebbe bloccarsi prima o poi quando il DB esaurisce le risorse.

+0

Quando provo a utilizzare rs.next() nell'istruzione while ottengo lo stesso errore. – aphex

+0

È possibile ottenere "Operazione non valida sul set di risultati vuoto" quando si chiama 'next()' su un gruppo di risultati appena acquisito. Quindi il tuo problema sta da qualche altra parte. O stai accedendo al set di risultati sbagliato o stai interpretando erroneamente l'eccezione e/o la riga di codice in cui è stata causata. – BalusC

+0

Se 'getSt' (suggerisco di usare parole complete) restituisce lo stesso' Statement', quindi non è una perdita. Il mio JDBC è molto arrugginito, ti è permesso continuare a usare un iteratore mentre esegui un'altra istruzione su 'Statement' (cattiva analogia: mutare una collezione mentre la iterazione su di essa)? Ad ogni modo, usa un 'PreparedStatement' piuttosto che un SQL dinamico. Modifica: Seconda riga di documenti dell'API 'Statement':" Per impostazione predefinita, solo un oggetto ResultSet per oggetto Statement può essere aperto contemporaneamente. " –

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