3

好的,我的代码目前是:

    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))

目前,在这种形式下,当我将阅读器返回为阅读器时,没有任何价值。我已经通过并验证了在返回时,读者的信息是正确的。然而,读者没有价值。我可能错过了一些完全愚蠢的东西。但是,我们将不胜感激任何和所有的帮助。谢谢!

4

2 回答 2

4

使用 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;
    }
于 2012-07-25T21:04:22.717 回答
2

您可以返回作为记录实现的基本接口的an,而不是将所有记录返回Datareader或复制到您作为一个整体返回的内存中。DataTableIEnumerable<IDataRecord>DataReader

所以这应该有效,因为保持活力的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"));
}
于 2012-07-25T21:18:45.383 回答