2010-01-22 21 views
46

Tengo problemas para obtener datos de un objeto ResultSet. Aquí está mi código:Excepción ResultSet: antes del inicio del conjunto de resultados

String sql = "SELECT type FROM node WHERE nid = ?"; 
    PreparedStatement prep = conn.prepareStatement(sql); 
    int meetNID = Integer.parseInt(node.get(BoutField.field_meet_nid)); 
    prep.setInt(1, meetNID); 

    ResultSet result = prep.executeQuery(); 
    result.beforeFirst(); 
    String foundType = result.getString(1); 

    if (! foundType.equals("meet")) { 
     throw new IllegalArgumentException(String.format("Node %d must be of type 'meet', but was %s", meetNID, foundType)); 
    } 

La traza de error:

Exception in thread "main" java.sql.SQLException: Before start of result set 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1072) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:986) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:981) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926) 
    at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:841) 
    at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5656) 
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5576) 
    at nth.cumf3.nodeImport.Validator.validate(Validator.java:43) 
    at nth.cumf3.nodeImport.Main.main(Main.java:38) 

¿Qué estoy haciendo mal aquí?

Respuesta

117

Básicamente se está colocando el cursor antes de la primera fila y luego solicitar datos. Debe mover el cursor a la primera fila.

result.next(); 
String foundType = result.getString(1); 

Es común hacer esto en una sentencia if o en un bucle.

if(result.next()){ 
    foundType = result.getString(1); 
} 
6

Tienes que hacer un result.next() antes de poder acceder al resultado. Es un lenguaje muy común hacer

ResultSet rs = stmt.executeQuery(); 
while (rs.next()) 
{ 
    int foo = rs.getInt(1); 
    ... 
} 
1

usted tiene que llamar next() antes de que pueda comenzar a leer los valores de la primera fila. beforeFirst coloca el cursor antes de en la primera fila, por lo que no hay datos para leer.

1

tiene que mover el puntero a la primera fila, antes de pedir los datos:

result.beforeFirst(); 
result.next(); 
String foundType = result.getString(1); 
2

Es mejor si se crea una clase que tiene todos los métodos de consulta, inclusive, en un paquete diferente, así que en vez de escribir todo el proceso en cada clase, simplemente llama al método de esa clase.

5

Cada respuesta usa .next() o usa .beforeFirst() y luego .next(). Pero por qué no esto:

result.first(); 

Así que acaba de establecer el puntero al primer registro e ir de allí. Está disponible desde Java 1.2 y solo quería mencionar esto para cualquiera cuyo ResultSet exista de un registro específico.

Cuestiones relacionadas