如何在关闭阅读器之前返回MySqlDataReader

时间:2012-07-25 20:28:37

标签: c# mysqldatareader

好的,我的代码目前是:

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

在另一个功能中,我有:

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

目前,在这种形式下,当我将读者送回读者时,没有任何价值。我已经介入,并确认在返回时,读者掌握了正确的信息。但读者没有价值观。我可能错过了一些完全愚蠢的东西。但是,任何和所有的帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:3)

使用using命令,您的代码实际上将在将控制权返回给调用者之前处理连接和命令。基本上你的连接对象和在using语句中创建的命令对象在调用代码能够使用之前被释放,因此它不再可用。

您可能希望对查询结果而不是阅读器本身执行某些操作。也许加载到表中?类似的东西:

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

答案 1 :(得分:2)

不是返回Datareader或将所有记录复制到整体返回的内存中DataTable,而是返回IEnumerable<IDataRecord>这是DataReader的基本接口{{ 1}}记录工具。

所以这应该有效,因为yield导致Connection保持活着:

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

如果您想要例如只拍摄前5条记录:

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