Question

Bon, mon code est actuellement :

    public MySqlDataReader CreateQuery(string queryString, string connectionString )
    {

        using (MySqlConnection connection = new MySqlConnection(connectionString))
        {
            using (MySqlCommand command = new MySqlCommand(queryString, connection))
            {
                command.Connection.Open();
                command.ExecuteNonQuery();

                MySqlDataReader reader = command.ExecuteReader();
                return reader;
            }
        }
    }

Dans une autre fonction, j'ai :

using(MySqlDataReader readers = _connection.CreateQuery(query, connectString))

Actuellement, sous cette forme, lorsque je renvoie un lecteur dans un lecteur, il n'y a aucune valeur.J'ai parcouru et vérifié qu'au moment du retour, le lecteur contenait les informations correctes.Pourtant, les lecteurs n’ont aucune valeur.Il me manque probablement quelque chose de complètement idiot.Mais toute aide à cet égard sera appréciée.Merci!

Était-ce utile?

La solution

Avec l'utilisation de la commande, votre code va réellement disposer de la connexion et de la commande avant que le contrôle est renvoyé à l'appelant.Essentiellement, votre objet de connexion et votre objet de commande créé dans l'utilisation des instructions sont disposés avant que le code d'appel puisse l'utiliser, de sorte qu'il n'est plus utilisable.

Vous voulez probablement faire quelque chose avec les résultats de la requête plutôt que le lecteur lui-même.Peut-être le charger dans une table?Quelque chose comme:

public DataTable CreateQuery(string queryString, string connectionString )
    {
        DataTable results =  new DataTable("Results");
        using (MySqlConnection connection = new MySqlConnection(connectionString))
        {
            using (MySqlCommand command = new MySqlCommand(queryString, connection))
            {
                command.Connection.Open();
                command.ExecuteNonQuery();

                using (MySqlDataReader reader = command.ExecuteReader())
                    results.Load(reader);
            }
        }
       return results;
    }

Autres conseils

Au lieu de renvoyer le Datareader ou copiez tous les enregistrements dans un fichier en mémoire DataTable que vous retournez dans son ensemble, vous pourriez retourner un IEnumerable<IDataRecord> qui est l'interface de base d'un DataReader enregistrer les outils.

Cela devrait donc fonctionner puisque le yield provoque le Connection à garder en vie :

public IEnumerable<IDataRecord> CreateQuery(string queryString, string connectionString)
{
    using (MySqlConnection connection = new MySqlConnection(connectionString))
    {
        using (MySqlCommand command = new MySqlCommand(queryString, connection))
        {
            command.Connection.Open();
            using (var reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    yield return (IDataRecord)reader;
                }
            }
         }
    }
}

Si vous voulez par exemple prendre uniquement les 5 premiers enregistrements :

var records = CreateQuery("SELECT * FROM ais.country;", Properties.Settings.Default.MySQL).Take(5);
foreach (IDataRecord rec in records)
{
    String country = rec.GetString(rec.GetOrdinal("Name"));
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top