-1

我创建了一个返回 mysql 数据读取器的方法。

public class DbHelper : BaseService
{
    public DbHelper(string connectionString) : base(connectionString)
    { }
    public static MySqlDataReader GetDataReader(string query)
    {
        using (MySqlConnection connection = new MySqlConnection(_connectionString))
        {
            connection.Open();
            using (MySqlCommand command = new MySqlCommand(query, connection))
            {
                MySqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
                return reader;
            }
        }
    }
}

接下来我写了:

var query = ""; //here my query string
var rdr = DbHelper.GetDataReader(query);

while (rdr.Read())
{
}

但我在这一行收到一个空引用异常return reader;

_connectionStringquery得到正确的估价。

我该如何解决?我究竟做错了什么?

4

1 回答 1

0

问题是围绕创建连接的使用。当您退出 using 块时,一切都已处理。因此 DataReader 不能工作,因为它不能使用在 using 块中设置的连接。

第一个非常简单的解决方法是在 using 块内执行循环,并在每个加载的记录调用输入参数中收到的委托

public static void FillWithDataReader(string query, Action<IDataRecord> filler)
{
    using (MySqlConnection connection = new MySqlConnection(_connectionString))
    {
        connection.Open();
        using (MySqlCommand command = new MySqlCommand(query, connection))
        {
            MySqlDataReader reader = command.ExecuteReader();
            while(reader.Read())
                filler(reader);
        }
    }
}

调用者可以通过这种方式调用FillWithDataReader

FillWithDataReader("SELECT something FROM somewhere", FillMyData);
.....

// This is called at each loop inside the FillWithDataReader    
public void FillMyData(IDataRecord record)
{
    string aSomething = record.GetString(record.GetOrdinal("something"));
    .....
}

现在读取器用于获取记录的连接仍然打开,您仍然可以将用于从数据库中提取数据的逻辑与用于填充模型或用户界面对象的逻辑分开。

于 2017-05-27T18:42:31.960 回答