2010-01-22 7 views
46

Ich habe Probleme, Daten von einem ResultSet Objekt zu bekommen. Hier ist mein Code:ResultSet Ausnahme - vor Beginn der Ergebnismenge

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)); 
    } 

Der Fehler-Trace:

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) 

Was mache ich falsch hier?

Antwort

117

zu tun Grundsätzlich Sie die Cursor positionieren, bevor die erste Reihe und dann Daten anfordert. Sie müssen den Cursor in die erste Zeile bewegen.

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

Es ist üblich, dies in einer if-Anweisung oder Schleife zu tun.

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

Sie müssen eine result.next() durchführen, bevor Sie auf das Ergebnis zugreifen können. Es ist ein sehr häufiges Idiom

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

Sie haben next(), bevor Sie anrufen können lesen Werte aus der ersten Reihe starten. beforeFirst setzt den Cursor vor die erste Zeile, so dass keine Daten zu lesen sind.

1

Sie müssen die Zeiger auf die erste Zeile zu bewegen, bevor Daten fragen:

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

Es ist besser, wenn Sie eine Klasse erstellen, die alle Abfragemethoden hat, einschließend, in einem anderen Paket, so dass anstelle Wenn Sie den gesamten Prozess in jeder Klasse eingeben, rufen Sie einfach die Methode aus dieser Klasse auf.

5

Jede Antwort verwendet .next() oder verwendet .beforeFirst() und dann .next(). Aber warum nicht das:

result.first(); 

Also Sie setzen den Zeiger auf den ersten Datensatz und gehen von dort. Es ist seit Java 1.2 verfügbar und ich wollte dies nur für jeden erwähnen, dessen ResultSet aus einem bestimmten Datensatz besteht.

Verwandte Themen