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é.

Était-ce utile?

La solution

D'après ce que j'ai compris, SqlDataReader est destiné à être utilisé pour une énumération unique des données que vous avez renvoyées. Une fois que vous avez parcouru les résultats, l'objet a fait son devoir. Voici quelques idées pour résoudre ce problème, l'une ou l'autre pouvant résoudre ce problème pour vous en fonction de vos besoins:

  1. Ré-exécutez la requête pour générer un autre SqlDataReader si nécessaire

  2. 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 autre utilisant le bloc (car il implémente IDisposable ) et fait la même chose avec la commande Sql Command (le même IDisposable interface)
  • Ne pas récupérer tous les champs de la base de données
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top