我有这个简单的函数来处理所有的查询:
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
之后读取器是否自动关闭?
答案 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);
}