我需要关闭数据读取器吗

本文关键字:读取 数据 | 更新日期: 2023-09-27 18:25:31

我有一个处理所有查询的简单函数:

DataTable ReadIt(string query, params MySqlParameter[] sqlParams)
{
    DataTable dt = new DataTable();
    using(MySqlConnection myConnection = new MySqlConnection(sConnection))
    {
        myConnection.Open();
        MySqlCommand myCommand = myConnection.CreateCommand();
        myCommand.CommandText = query;
        foreach (var p in sqlParams)
        {
            myCommand.Parameters.Add(p);
        }
        MySqlDataReader myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
        dt.Load(myReader);
        myReader.Close();
    }
    return dt;
}

我需要在将数据加载到数据表后放入myReader.Close();吗?还是在using之后读取器自动关闭?

我需要关闭数据读取器吗

您不知道(或者至少不应该知道)DataReader拥有什么资源
另一方面,每个一次性对象都应该被处理,因为在处理代码中,对象有机会尽快释放所使用的资源
因此,您的MySqlDataReader也应该遵循MySqlConnection和MySqlCommand使用的相同模式。使用声明是你的朋友

using(MySqlConnection myConnection = new MySqlConnection(sConnection))
using(MySqlCommand myCommand = myConnection.CreateCommand())
{
    myConnection.Open();
    myCommand.CommandText = query;
    foreach (var p in sqlParams)
        myCommand.Parameters.Add(p);
    using(MySqlDataReader myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection))
    {
        dt.Load(myReader);
    }
}
如果没有更多的结果网格,

DataTable.Load将自动关闭读取器。这对我来说有点偶然;我会使用using:

using(var myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection)) {
    dt.Load(myReader);
}