我是否需要关闭datareader

时间:2014-10-03 14:53:30

标签: c# mysql asp.net

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

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之后读取器是否自动关闭?

2 个答案:

答案 0 :(得分:7)

您不知道(或至少您不应该知道)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);
    }
}

答案 1 :(得分:3)

如果没有更多结果网格,

DataTable.Load会自动关闭阅读器。对我来说,这有点受欢迎;我使用using

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