Quelle est la meilleure façon de détecter si un IDataReader est vide?
Il semble que IDataReader.Read() est toujours vrai au moins une fois (Si je me trompe sur ce laissez-moi savoir.) Alors, comment dites-vous si elle n'a pas de documents sans juste envelopper dans un try/catch?
- C'est Ben correct. Si un IDataReader est la lecture à partir d'un ensemble de lignes vide puis le premier appel à Read() retourne false (en supposant que la mise en œuvre spécifique que vous utilisez est écrit correctement).
- Qui n'a pas de sens. Si lire est censé indiquer s'il y a plus de lignes, alors il ne peut pas représenter un vide. Par exemple, en renvoyant false en première lecture n'indique pas un ensemble vide. Il indique n'a plus de ligne après le premier enregistrement a déjà été lu.
Vous devez vous connecter pour publier un commentaire.
habituellement, vous allez faire cela:
Read()
avances le lecteur à la ligne suivante. Afin de ne pas uniquement vérifier si le datareader contient des donnéesOui, si vous voulez utiliser l'interface, puis de Lire jusqu'à ce que le faux est le seul moyen de tester. Si vous êtes à la recherche pour un générique
IDataReader
mise en œuvre, vous pouvez essayer deDbDataReader
et l'utilisation de laHasRows
propriété.Read()
sur unIDataReader
objet de toute façon, car il n'y a pas une telle chose. Et dans à peu près toutes les implémentations réelles vous allez obtenir un objet qui est uneDbdataReader
. Donc, sauf si vous avez les classes "déclassement" qui de retour àIDataReader
que leur type de retour, vous pouvez les appeler qui. Et même si elle est revu à la baisse, il vaut la peine de vérifier:if (reader is DbDataReader) return ((DbDataReader)reader).HasRows
Vous pouvez juste lancer
System.Data.IDataReader
àSystem.Data.Common.DbDataReader
C'est le mal pur, mais c' (en général) fonctionne 😉
(en supposant que votre instance de
IDataReader
est mis en œuvre par une coutume ADO.NET fournisseur, et non pas coutume, idiot de la classe de la vôtre, qui vient de implémenteIDataReader
au lieu de dérivation deDbDataReader
[qui implémenteIDataReader
]).Juste tombé sur ce problème et est venu avec cette...