2010-03-30 16 views
5

¿Cómo puedo iterar ResultSet? Lo he intentado con el siguiente código, pero obtengo el error java.sql.SQLException: operación ilegal en el conjunto de resultados vacío.Problema con SQL, ResultSet en java

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

Actualización: He encontrado el problema. Solo he usado una declaración del SQL singleton. Cuando la declaración está cerrada, no se puede usar nuevamente.

Respuesta

11

Según el JDBC tutorial:

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

Los ResultSet#next() se mueve el cursor hacia delante una fila desde su posición actual y devuelve true si la nueva fila actual es válida. Por lo tanto, el ciclo while se detendrá automáticamente cuando no haya más filas.

si se supone volver a cero o una fila en lugar de múltiples filas, a continuación, en lugar utilizar if lugar:

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

De esta manera usted tiene la oportunidad de añadir una else.

Actualización, dicho esto y sin relación con el problema real, veo más problemas potenciales en su código: primero, parece que activa varias consultas que dependen una de la otra. Esto se puede hacer de manera más eficiente. ¿Está familiarizado con SQL Joins? Segundo, ¿no estás perdiendo recursos de JDBC? Parece que está adquiriendo una declaración, pero no tiene un control para poder cerrarla correctamente después de su uso. Consulte el tutorial JDBC antes enlazado para obtener una explicación básica de cómo trabajar correctamente con el código JDBC y this article para obtener ejemplos básicos de cómo utilizar JDBC correctamente. De lo contrario, su aplicación puede fallar tarde o temprano cuando el DB se quede sin recursos.

+0

Cuando trato de usar rs.next() en la sentencia while recibo el mismo error. – aphex

+0

Es imposible obtener 'Operación ilegal en el conjunto de resultados vacío' al llamar 'next()' en un conjunto de resultados recién adquirido. Entonces tu problema está en otro lado. O está accediendo al conjunto de resultados incorrecto o está malinterpretando la excepción y/o la línea de código donde se ha producido. – BalusC

+0

Si 'getSt' (sugiero usar palabras completas) devuelve el mismo' Statement', entonces no es una fuga. Mi JDBC está muy oxidado, ¿se te permite continuar usando un iterador mientras se ejecuta otra declaración en el 'Statement' (mala analogía: mutar una colección mientras se itera sobre ella)? De todos modos, use un 'PreparedStatement' en lugar de SQL dinámico. Editar: segunda línea de documentos de API de 'Statement':" De forma predeterminada, solo un objeto ResultSet por objeto Statement puede abrirse al mismo tiempo. " –

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