web-dev-qa-db-fra.com

Que signifie «if (rs.next ())»?

Je reçois actuellement l'erreur,

Java.sql.SQLException: Method 'executeQuery(String)' not allowed on prepared statement.

parce que j'utilise

PreparedStatement stmt = conn.prepareStatement(sql);

et avait aussi

ResultSet rs = stmt.executeQuery(sql);

dans mon code.

Je dois maintenant supprimer la ligne ResultSet mais cela me laisse d'avoir à gérer le code suivant:

if (rs.next()) {
    messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("login.successful"));
    request.getSession(true).setAttribute("USERNAME", rs.getString("USERNAME"));
    request.getSession(true).setAttribute("BALANCE", rs.getString("BALANCE"));
    request.setAttribute("msg", "Logged in successfully");

Je ne suis pas sûr de bien comprendre

 if (rs.next())

est-ce que. Quelqu'un pourrait-il m'expliquer ce code? Si j'ai une meilleure compréhension de cela, je crois que j'aurai une meilleure idée sur la façon de gérer l'utilisation des résultats PreparedStatement avec la logique utilisée pour rs. Toute aide pour faire face à la modification de cette logique serait également grandement appréciée.

11
Turk

Quant au problème concret avec ce SQLException, vous devez remplacer

ResultSet rs = stmt.executeQuery(sql);

par

ResultSet rs = stmt.executeQuery();

car vous utilisez la sous-classe PreparedStatement au lieu de Statement. Lorsque vous utilisez PreparedStatement, vous avez déjà passé la chaîne SQL à Connection#prepareStatement(). Il vous suffit de définir les paramètres dessus, puis d'appeler directement la méthode executeQuery() sans repasser la chaîne SQL.

Voir également:


Quant à la question concrète sur rs.next(), elle déplace le curseur sur la ligne suivante du jeu de résultats de la base de données et renvoie true s'il y a une ligne, sinon false . En combinaison avec l'instruction if (au lieu de while), cela signifie que le programmeur n'attend ou ne s'intéresse qu'à une seule ligne, la première ligne.

Voir également:

8
BalusC

La next() déplace le curseur d'une ligne de sa position actuelle dans le resultset. il est donc évident que if(rs.next()) signifie que si la ligne suivante n'est pas null (signifie si elle existe), Aller de l'avant .

Maintenant, quel est votre problème,

ResultSet rs = stmt.executeQuery(sql);  //This is wrong
                                  ^       

notez que executeQuery (String) est utilisé dans le cas où vous utilisez une requête sql comme chaîne.

Alors que lorsque vous utilisez un PreparedStatement , utilisez executeQuery () qui exécute la requête SQL dans cet objet PreparedStatement et renvoie l'objet ResultSet généré par la requête.

Solution:

Utilisez: ResultSet rs = stmt.executeQuery();

4
COD3BOY

Je suppose que vous utilisez Java 6 et que l'ensemble de résultats que vous utilisez est un Java.sql.ResultSet.

JavaDoc pour la méthode ResultSet.next () indique:

Déplace le curseur d'une ligne de sa position actuelle. Un curseur ResultSet est initialement positionné avant la première ligne; le premier appel à la méthode fait ensuite de la première ligne la ligne actuelle; le deuxième appel fait de la deuxième ligne la ligne actuelle, et ainsi de suite.

Lorsqu'un appel à la méthode suivante renvoie false, le curseur est positionné après la dernière ligne. Toute invocation d'une méthode ResultSet qui nécessite une ligne actuelle entraînera la levée d'une exception SQLException.

Ainsi, if(rs.next(){ //do something } signifie "Si le jeu de résultats contient toujours des résultats, passez au résultat suivant et faites quelque chose".

Comme l'a souligné BalusC , vous devez remplacer

ResultSet rs = stmt.executeQuery(sql);

avec

ResultSet rs = stmt.executeQuery();

Parce que vous avez déjà défini le SQL à utiliser dans l'instruction avec votre ligne précédente

PreparedStatement stmt = conn.prepareStatement(sql);

Si vous n'utilisiez pas le PreparedStatement, alors ResultSet rs = stmt.executeQuery(sql); fonctionnerait.

3
chrisbunney

La méthode next() (doc officiel ici ) déplace simplement le pointeur des lignes de résultat sur la ligne suivante (si elle le peut). Quoi qu'il en soit, vous pouvez également lire ceci dans le document officiel:

Déplace le curseur d'une ligne de sa position actuelle.

Cette méthode retourne true s'il y a une autre ligne ou false sinon.

2
Aurelio De Rosa

Regardez l'image, c'est un ensemble de résultats d'une requête sélectionnez * de l'employé

enter image description here

et la méthode next () de la classe ResultSet aide à déplacer le curseur sur la ligne suivante d'un jeu de résultats renvoyé qui est rs dans votre exemple.

:)

0
Ali Ben Messaoud

Étant donné que l'ensemble de résultats est une interface, lorsque vous obtenez une référence à un ResultSet via un appel JDBC, vous obtenez une instance d'une classe qui implémente l'interface ResultSet. Cette classe fournit des implémentations concrètes de toutes les méthodes ResultSet.

Les interfaces sont utilisées pour séparer la mise en œuvre de, enfin, l'interface. Cela permet la création d'algorithmes génériques et l'abstraction de la création d'objets. Par exemple, les pilotes JDBC pour différentes bases de données renverront différentes implémentations ResultSet, mais vous n'avez pas à modifier votre code pour le faire fonctionner avec les différents pilotes

En bref, si votre ResultSet contient un résultat, alors en utilisant rs.next, retournez true si vous avez un jeu d'enregistrements sinon, il retourne false.

0
Robin

Première chose, vous n'avez pas besoin d'écrire

ResultSet rs = stmt.executeQuery(sql);

ecrivez

ResultSet rs = stmt.executeQuery();

La syntaxe mentionnée ci-dessus est utilisée pour les instructions et non pour PreparedStatement.

Deuxièmement, rs.next () vérifie si le jeu de résultats contient des valeurs ou non. Il renvoie une valeur booléenne et déplace le curseur sur la première valeur du jeu de résultats, car il se trouve initialement à BEFORE FIRST Position. Donc, si vous souhaitez accéder à la première valeur du jeu de résultats, vous devez écrire rs.next ().

0
gprathour