asp net core - NullReferenceException:如何从方法中 return mysql 数据 reader?

asp net core - NullReferenceException: how to return mysql data reader from method?

我已经为 return mysql 数据 reader 创建了一个方法。

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 已正确定值。

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

问题是围绕创建连接的使用。当您退出 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"));
    .....
}

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