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