IDataReader se vide lors de la visualisation pour la deuxième fois
-
06-07-2019 - |
Question
J'obtiens quelque chose d'assez étrange lorsque j'essaie de lire des données à l'aide du connecteur MySql .net. Voici le code:
IDataReader reader = null;
using (MySqlConnection connection = new MySqlConnection(this.ConnectionString))
{
String getSearch = "select * from organization";
MySqlCommand cmd = new MySqlCommand(getSearch, connection);
cmd.CommandType = CommandType.Text;
connection.Open();
reader = cmd.ExecuteReader();
while (reader.Read())
{
// response write some stuff to the screen (snipped for brevity)
}
}
Si je place un point d'arrêt après ExecuteReader et que je développe la vue des résultats dans Visual Studio (survolant le lecteur et en développant), je peux voir les lignes renvoyées par la requête. Si je laisse ensuite cela fermer et développer à nouveau la vue des résultats, je reçois le message "L'énumération n'a donné aucun résultat".
Il semble que le contenu du lecteur soit réinitialisé dès qu'il est visualisé.
En ce qui concerne ce que nous avons essayé:
- le code SQL fonctionne correctement directement sur la base de données
- La liaison directe des résultats de la requête à une grille de données ne renvoie qu'une grille de données vide.
- dispose de la dernière version du connecteur .net
- essayé sur deux machines différentes d'éliminer les erreurs locales
Jusqu'à présent, rien n'a fonctionné.
Si quelqu'un pouvait proposer des idées ou des suggestions, il serait très apprécié.
La solution
-
Ré-exécutez la requête pour générer un autre SqlDataReader si nécessaire
-
Au lieu d'utiliser SqlDataReader, stockez les résultats de votre requête d'origine dans un System.Data.DataTable, où vous pourrez ensuite relire et manipuler les données à votre guise.
J'espère que ça aide!
Adam
Autres conseils
Puisqu'un datareader lit des informations, votre bloc using ferme la connexion au lecteur juste après l'attribution de sa valeur à la variable. Voici un article qui vous montre quelques exemples de code qui pourraient vous amener là où vous devez être.
La clé est que la connexion DOIT être ouverte lorsque vous essayez de lire à partir du lecteur.
Voici l'explication:
En effet, vous avez déjà parcouru le lecteur une fois dans le débogueur (la première fois que vous avez développé la vue). C’est ainsi que fonctionnent les lecteurs et, d’après ce que je sais, il n’ya aucun moyen de réinitialiser un lecteur pour qu’il lise à nouveau et recommence depuis le début, à l’exception de l’option de ré-exécution:
Il vous suffit de relancer le
cmd.ExecuteReader ();
ligne (par la droite cliquer dans la source et utiliser "" set" déclaration suivante " option de menu).
C’est le comportement des lecteurs de données. Si vous l'avez déjà parcouru, vous ne pouvez pas revenir en arrière. Vous devez exécuter la commande à nouveau et en récupérer une nouvelle.
Si vous devez utiliser vos données après avoir fermé le lecteur, vous pouvez choisir d'utiliser un DataSet typé
ou le DataSet
non typé, comme spécifié dans Adam answer .
Au fait, voici quelques optimisations
que vous pourriez réaliser:
- Déplacez le lecteur à l'intérieur du
Connexion
en utilisant un bloc pour le faire sortir de la portée après avoir terminé en l'utilisant (une fois que vous avez fini d'utiliser bloquer, la connexion sera fermée et vous ne pourrez pas l'utiliser de toute façon, donc ça n'a pas de sens de le laisser dehors) - Exécuter
ExecuteReader
dans un autreutilisant le bloc
(car il implémenteIDisposable
) et fait la même chose avec la commande SqlCommand
(le mêmeIDisposable
interface) - Ne pas récupérer tous les champs de la base de données