DataReader a des lignes et des données, en train d'essayer de lire, il dit: “aucune donnée n'est présent”

Je n'ai pas utilisé DataReaders dans les âges (je préfère utiliser un ORM), mais je suis forcé au travail. J'tirez les lignes, et de vérifier que HasRows est vrai; le débogage à ce point, et en examinant le lecteur montre que mes données sont là.

Maintenant, voici le problème: au moment où j'appelle reader.Read(), essayer d'étendre les résultats, dit "L'énumération donné aucun résultat" ou que ce soit, et j'obtiens le "non Valide tentez de lire lorsqu'aucune donnée n'est présente." erreur. J'obtiens la même chose si je ne l'appelez pas Read() (qui est la valeur par défaut depuis le DataReader commence avant le premier enregistrement).

Je ne me souviens pas de la bonne façon de gérer cela; les données est là quand j'ai vérifier HasRows, mais est allé le moment, j'ai essayer de lire juste après ou après que j'appelle Read, qui n'a aucun sens comme si je ne l'appelez pas Read, le lecteur doit toujours être avant le premier enregistrement, et si la propriété est définie qu'il commence sur le premier enregistrement (Commandbehavior? J'ai oublié le nom) est définie, alors je devrais être capable de lire les lignes sans faire appel à Lire, cependant, les deux voies semblent se déplacer passé la ligne contenant les données.

Que suis-je oublier? Le Code est assez simple:

TemplateFile file = null;
using (DbDataReader reader = ExecuteDataReaderProc("GetTemplateByID", idParam)) 
{ 
    if (reader.HasRows) //reader has data at this point - verified with debugger
    { 
        reader.Read(); //loses data at this point if I call Read()
        template = new TemplateFile 
        {
            FileName = Convert.ToString(reader["FileName"]) //whether or not I call
                                                            //Read, says no data here
        };
    }
}
ne reader.Read() retour true ou false ? pourquoi ne pas simplement utiliser if(reader.Read()) ou while(reader.Read()) ?
aussi - quand vous dites "vérifié avec le débogueur" ... comment exactement ? (juste pour essayer de voir si votre test peut-être cassé les données)
Pour confirmer ce que @Marc a dit, j'ai eu un problème dans le passé où le survol d'une queryable variable causé le débogueur pour aller chercher les résultats, ce qui signifiait alors le code ne pouvais pas terminer car vous ne pouvez les énumérer sur les enregistrements (ce qui le débogueur l'avait fait). Serait-ce la même chose? (Cela pourrait aussi se produire avec des Montres?)
Je développez le ResultsView de la propriété, ce qui montre une "DataRecordInternal" énumérable, qui a des propriétés qui, si je perce assez de recul, je peux voir les données renvoyées. Il ne fonctionne qu'une fois; après je forer vers le bas à ResultsView la première fois tous les futurs essaie, dit "L'énumération donné aucun résultat" (ce qui est logique puisqu'il permettrait de déplacer le lecteur de données). Aussi, oui reader.Read() retourne vrai, mais encore dit il n'y a pas de données lorsque j'essaie d'utiliser une valeur; par ailleurs, si je développez après l'appel à Read() j'obtiens toujours "Énumération donné aucun résultat", mais il a des résultats au cours de HasRows.
à la fois appel à Read() et de forage dans le modifier l'état, et elle ne fonctionnera plus. Ne pas le faire (dans ce cas). Je pense que dans ce cas-ci: débogueur considéré comme nocif. Donc ce qui se passe lorsque vous n'utilisez pas le débogueur / watch windows / etc?

OriginalL'auteur Wayne Molina | 2011-06-27