web-dev-qa-db-fra.com

ResultSet exception - avant le début du jeu de résultats

Je n'arrive pas à obtenir les données d'un objet ResultSet. Voici mon 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));
    }

La trace d'erreur:

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'est-ce que je fais mal ici?

65
Nick Heiner

Fondamentalement, vous positionnez le curseur avant la première ligne, puis vous demandez des données. Vous devez déplacer le curseur sur la première ligne.

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

Il est courant de faire cela dans une instruction if ou une boucle.

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

Chaque réponse utilise .next () ou utilise .beforeFirst () puis .next (). Mais pourquoi pas ceci:

result.first();

Donc, vous venez de définir le pointeur sur le premier enregistrement et à partir de là. Il est disponible depuis Java 1.2 et je voulais juste le mentionner pour toute personne dont le ResultSet existe d'un enregistrement spécifique.

9
MmynameStackflow

Vous devez faire un result.next () avant de pouvoir accéder au résultat. C'est un langage très courant à faire

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

Vous devez appeler next() avant de pouvoir commencer à lire les valeurs de la première ligne. beforeFirst place le curseur avant à la première ligne, il n'y a donc aucune donnée à lire.

2
Dan

Il est préférable de créer une classe contenant toutes les méthodes de requête, de manière inclusive, dans un package différent. Par conséquent, au lieu de saisir tous les processus dans chaque classe, vous appelez simplement la méthode à partir de cette classe.

2
Pedro

Vous devez déplacer le pointeur sur la première ligne avant de demander des données:

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