Pregunta

Bien, mi código actualmente es:

    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;
            }
        }
    }

En otra función, tengo:

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

Actualmente, de esta forma, cuando devuelvo lector a lectores, no hay ningún valor.Pasé y verifiqué que en el momento de la devolución, el lector tenía la información correcta.Sin embargo, los lectores no tienen valores.Probablemente me estoy perdiendo algo completamente tonto.Pero se agradecerá cualquier ayuda en esto.¡Gracias!

¿Fue útil?

Solución

Con el comando Uso, su código en realidad va a disponer de la conexión y el comando antes de que se devuelva el control a la persona que llama.Esencialmente, su objeto de conexión y su objeto de comando creado en las declaraciones usando están dispuestas antes de que el código de llamada sea capaz de usarlo, por lo que ya no se puede usar.

Probablemente desee hacer algo con los resultados de la consulta en lugar del que el lector.¿Tal vez cargarlo en una mesa?Algo así como:

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;
    }

Otros consejos

En lugar de devolver el Datareader o copiar todos los registros en una memoria DataTable que devuelvas en su totalidad, podrías devolver un IEnumerable<IDataRecord> cual es la interfaz básica DataReader implementos de registro.

Entonces esto debería funcionar desde el yield causa el Connection para mantenerse vivo:

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 quieres, por ejemplo, toma solo los primeros 5 registros:

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"));
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top