asp net core - NullReferenceException:如何从方法中返回mysql数据读取器?

时间:2017-05-27 18:30:18

标签: c# mysql asp.net-core mysqldatareader

我已经创建了一个返回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正确定价。

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

1 个答案:

答案 0 :(得分:0)

问题是围绕创建连接使用。当你从使用区块退出时,一切都被处理掉了。因此,DataReader无法工作,因为它无法使用在使用块中配置的连接。

第一个非常简单的解决方法是在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"));
    .....
}

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