Le pilote JDBC lève l'exception "ResultSet Closed" sur le ResultSet vide
J'ai un problème dans le pilote JDBC pour SQLite.
Je suis de l'exécution d'une requête SELECT.
Si je reçois un vide ResultSet
(0 lignes), puis je vois un "Fermé ResultSet" exception levée lors de l'appel de getString(1)
.
Sans trop avant JDBC expérience, ma théorie (qui je ne pouvais pas confirmer par Javadoc ResultSet
), c'est que
getString(1)
ne fonctionne PAS sur un vide (zéro-ligne) jeu de résultats (par leur conception ou à cause d'un bug)ResultSet
s '"ouvrir" le drapeau est réglé surfalse
sur des lignes nulles (encore une fois, de par leur conception ou un bug)
J'ai vu ce rapport de bug mais je suis pas sûr si c'est lié.
Mon qeustions sont:
- Est la théorie ci-dessus correcte?
- Est-ce un bug? Fonctionnalité? (et si oui, quelqu'un peut-point de la documentation, s'il vous plaît?)
- Est-il spécifique à SQLIte est JDBC ou génériques
ResultSet
dans tous les pilotes JDBC? - Quelle est la bonne façon de faire des trucs comme ça??
Pour le #4, ma solution a été d'utiliser isFirst()
appel juste après executeQuery()
pour vérifier si toutes les lignes sont là, dans le jeu de résultats. Est-ce l'approche des meilleures pratiques?
(Je pourrais aussi ont tout simplement choisi un nombre insetad puisque je n'ai pas vraiment besoin d'un ensemble de résultats, simplement zéro différente de zéro drapeau, mais je veux savoir la bonne thingh faire si je n'ai soucient de sélectionner les résultats de l')
Merci!
source d'informationauteur DVK
Vous devez vous connecter pour publier un commentaire.
Vide ou pas, mais de faire ce qui suit est toujours défectueux:
Ce n'est pas un bug. C'est comportement documenté. Chaque décent JDBC tutoriel le mentionne. Vous devez définir le jeu de résultats du curseur à l'aide de
next()
avant de pouvoir accéder à toutes les données.Si vous êtes réellement intéressé de savoir si la soi-disant ligne unique existent ou pas, puis il suffit de vérifier le résultat de
next()
. Par exemple, dans un fictifUserDAO
classe:Si vous attendons seulement zéro ou un ligne, puis il suffit de faire quelque chose comme:
et puis il suffit de le gérer en conséquence dans l'entreprise/l'objet de domaine, par exemple
Si vous attendons seulement zéro ou de nombreux lignes, puis il suffit de faire quelque chose comme:
et puis il suffit de le gérer en conséquence dans l'entreprise/l'objet de domaine, par exemple
De la Javadoc Jeu de résultats:
Vous aurez besoin de la position de la
ResultSet
sur une ligne, par exemple en appelant appelantnext()
avant de tenter de lire les données. Si l'appel ànext()
retournefalse
puis le résultat est vide.Pour ce genre de problème que vous pourriez utiliser comme ça