Ich habe Probleme beim Abrufen von Daten von einem ResultSet
Objekt. Hier ist mein Code:
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));
}
Die Fehlersuche:
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 hier falsch?
result.first()
für dieses Szenario verwenden.Jede Antwort verwendet
.next()
oder verwendet.beforeFirst()
und dann.next()
. Aber warum nicht das:Sie setzen also einfach den Zeiger auf den ersten Datensatz und gehen von dort aus. Es ist seit Java 1.2 verfügbar und ich wollte dies nur für jeden erwähnen, der
ResultSet
von einem bestimmten Datensatz existiert.quelle
first()
erfordert eine scrollbare Ergebnismenge. Die API erfordert, dass eine Ausnahme ausgelöst wird, wenn die Ergebnismenge lautetTYPE_FORWARD_ONLY
.Sie müssen eine result.next () ausführen, bevor Sie auf das Ergebnis zugreifen können. Es ist eine sehr verbreitete Redewendung
ResultSet rs = stmt.executeQuery(); while (rs.next()) { int foo = rs.getInt(1); ... }
quelle
Sie müssen aufrufen,
next()
bevor Sie Werte aus der ersten Zeile lesen können.beforeFirst
setzt den Cursor vor die erste Zeile, sodass keine Daten zu lesen sind.quelle
Es ist besser, wenn Sie eine Klasse erstellen, die alle Abfragemethoden einschließlich in einem anderen Paket enthält. Anstatt den gesamten Prozess in jeder Klasse einzugeben, rufen Sie einfach die Methode aus dieser Klasse auf.
quelle
Sie müssen den Zeiger in die erste Zeile bewegen, bevor Sie nach Daten fragen:
result.beforeFirst(); result.next(); String foundType = result.getString(1);
quelle