84 votes

Exception ResultSet - avant le début du result set

J'ai des difficultés à obtenir des données d'un ResultSet objet. 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 de l'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 de travers ?

177voto

Vincent Ramdhanie Points 46265

En fait, vous positionnez le curseur avant la première ligne, puis vous demandez des données. Vous devez déplacer le curseur jusqu'à la première ligne.

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

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

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

12voto

MmynameStackflow Points 139

Chaque réponse utilise [.next()](https://docs.oracle.com/en/java/javase/11/docs/api/java.sql/java/sql/ResultSet.html#next()) ou utilise [.beforeFirst()](https://docs.oracle.com/en/java/javase/11/docs/api/java.sql/java/sql/ResultSet.html#beforeFirst()) et ensuite .next() . Mais pourquoi pas ceci :

result.first();

Il suffit donc de placer le pointeur sur le premier enregistrement et de continuer à partir de là. C'est disponible depuis Java 1.2 et je voulais juste le mentionner pour tous ceux qui ont l'habitude d'utiliser le système d'information. ResultSet existe pour un enregistrement spécifique.

10voto

Paul Tomblin Points 83687

Vous devez effectuer un result.next() avant de pouvoir accéder au résultat. Il est très courant de faire un

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

3voto

Dan Points 6451

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 pas de données à lire.

2voto

Pedro Points 11

Il est préférable de créer une classe qui contient toutes les méthodes d'interrogation, inclusivement, dans un paquet différent. Ainsi, au lieu de taper tous les processus dans chaque classe, il suffit d'appeler la méthode de cette classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X