Eccezione ResultSet – prima dell’inizio del set di risultati

Sto riscontrando problemi nel ricevere dati da un object ResultSet . Ecco il mio codice:

  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 traccia di errore:

 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) 

Cosa sto facendo di sbagliato qui?

Fondamentalmente stai posizionando il cursore prima della prima riga e poi richiedendo i dati. È necessario spostare il cursore sulla prima riga.

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

È comune farlo in un’istruzione if o in un ciclo.

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

Devi fare un risultato.next () prima di poter accedere al risultato. È un idioma molto comune da fare

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

Ogni risposta usa .next () o usa .beforeFirst () e poi .next (). Ma perché non questo:

 result.first(); 

Quindi basta impostare il puntatore sul primo record e andare da lì. È disponibile da java 1.2 e volevo solo menzionarlo per chiunque abbia un ResultSet di un record specifico.

È meglio se si crea una class che ha tutti i metodi di interrogazione, in modo inclusivo, in un pacchetto diverso, quindi invece di digitare tutto il processo in ogni class, basta chiamare il metodo da quella class.

Devi chiamare next() prima di poter iniziare a leggere i valori dalla prima riga. beforeFirst mette il cursore prima della prima riga, quindi non ci sono dati da leggere.

È necessario spostare il puntatore sulla prima riga, prima di chiedere i dati:

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