9
votes

Le pilote JDBC jette «Result Fermé» Exception sur les Resulats Emple

J'ai un problème dans le pilote JDBC pour SQLite.

J'exécute une requête avec une instruction SELECT.

Si je reçois un "code> vides" / code> (0 rangées), je vois une exception "Resultats" fermée "lancée lorsque vous appelez getstring (1) . .

Sans beaucoup d'expérience de JDBC antérieur, ma théorie (que je ne pouvais pas confirmer via javadocs pour ResulatsSet ) est-ce

  • getString (1) ne fonctionne pas sur des résultats (par des lignes zéro) (par conception ou en raison d'un bogue)
  • ResultatsSet (code> 'S "Open" Drapeau est défini sur False sur zéro rangée (à nouveau, par design ou un bug)

    J'ai vu ce Signaler de bogues mais je ne suis pas sûr Si c'est lié.

    Mes QEustions sont:

    1. Est-ce la théorie ci-dessus correcte?
    2. est-ce un bug? Caractéristique? (Et si oui, quelqu'un peut-il indiquer la documentation s'il vous plaît?)
    3. est-il spécifique à la JDBC de SQLite ou à Generic Resulatset dans tous les pilotes JDBC?
    4. Quelle est la bonne façon de faire des choses comme ça? ?

      Pour # 4, ma solution consistait à utiliser Isfirst () appel à droite après ExecuteQuery () Pour vérifier si des lignes sont présentes dans le jeu de résultats. Est-ce la meilleure approche de la pratique?

      (Je pourrais aussi avoir simplement sélectionné un comte insetad car je n'ai pas vraiment besoin d'un ensemble de résultats, simplement zéro-non-zéro drapeau, mais je veux connaître la bonne chose à faire si je me soucie des résultats de Select)

      merci!


1 commentaires

Merci tout le monde! Très illuminant!


4 Réponses :


6
votes
while (rs.next()) {
 // process the row
}

1 commentaires

Cette réponse n ° 4. Qu'en est-il de # 1-3? :)



5
votes

des Javadocs pour RESUNTERT :

Un objet Resulatset maintient un curseur pointant vers sa ligne actuelle de données. Initialement le curseur est positionné avant la première rangée. La méthode suivante déplace le curseur sur la rangée suivante et parce qu'il retourne faux quand il ne sont plus des lignes dans les Resultset objet, il peut être utilisé dans une boucle de temps itérer à travers le jeu de résultats.

Vous devrez positionner le ResulatsT d'une ligne, par exemple. En appelant appelant suivant () , avant de tenter de lire toutes les données. Si l'appel à suivant () renvoie false alors le jeu de résultats est vide.


3 commentaires

Cette réponse n ° 4. Qu'en est-il de # 1-3? :)


@Dvk il n'a pas de sens d'appeler getstring jusqu'à ce que les résultats sont positionnés sur une rangée, il est donc logique qu'il soulève une exception (ceci s'applique pour tout JDBC conducteur). Je ne suis pas sûr de ce que vous parlez de la "drapeau" Open "du Restaurantset '.


Dans le débogueur de Eclipse, lors de l'examen de l'ensemble de résultats, le membre "Open" a une valeur "FALSE". C'est la raison de l'exception "ResultSet Closed" (pas la cause sous-jacente, mais la variable immédiate qui est examinée pour générer l'exception dans la source JDBC)



18
votes

vide ou non, mais que ce qui suit est toujours défectueux fort>: xxx pré>

Ce n'est pas un bug. C'est comportement documenté . Chaque Didacticiel JDBC décent le mentionne. Vous devez définir le curseur du ResultSet en utilisant Suivant () code> avant d'accéder à toutes les données. P>

Si vous êtes intéressé si la ligne supposée unique existe Strong> ou non, alors simplement vérifier le résultat de suivant () code>. Par exemple dans un userDao code> Classe: p> xxx pré>

si vous n'attendez réellement que zéro fort> ou un Strong> rangée, puis faire quelque chose comme: p> xxx pré>

puis le gérer en conséquence dans l'objet Business / Domain, par exemple P>

List<User> users = userDAO.list();

if (!users.isEmpty()) {
    int count = users.size();
    // ...
}
else {
    // Help, no users?
}


1 commentaires

Je choisis de "accepter" celui-ci en raison de la largeur des exemples de code et des liens DOC.



1
votes

Pour un tel problème, vous pouvez utiliser comme ça

while(rs.next())
{
    String name=rs.getString("Name");
    int roll_no=Integer.parseInt(rs.getString("Roll"));
}
finally
{
    try
    {
        rs.close();
        pst.close();
    }
    catch(Exception ee)
    {
    }
}

Joptionpane.showmessahedialog(this,ee);


3 commentaires

Soin de formater le post. J'ai formaté une de vos réponses, vérifiez et formatez d'autres réponses, le cas échéant!


merci de mayesh mayani je suis nouveau pour ce site.


Pas de soucis ... Continuez votre contribution!