Cómo devolver un MySqlDataReader antes de que se cierre el lector [duplicado]
-
11-12-2019 - |
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!
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"));
}