这是我在MySql中从表中选择数据的代码:
MySqlDataReader msdr;
MySqlConnection connect = new MySqlConnection(connectionStringMySql);
MySqlCommand cmd = new MySqlCommand();
string commandLine = "SELECT id,token FROM Table WHERE id = @id AND token = @token;";
cmd.CommandText = commandLine;
cmd.Parameters.AddWithValue("@id", id);
cmd.Parameters.AddWithValue("@token", token);
cmd.Connection = connect;
cmd.Connection.Open();
msdr = cmd.ExecuteReader();
//do stuff.....
msdr.Close();
cmd.Connection.Close();正如您所看到的,我关闭这两个:
msdr.Close();
cmd.Connection.Close();我想问我是否需要关闭这两个?或者,可以只关闭cmd.Connection.Close();
我问它的原因是,有时当我尝试选择表中的数据时会出现以下错误:Details: MySql.Data.MySqlClient.MySqlException: Too many connections
我想知道是不是因为我没有关闭这种连接。
发布于 2013-06-03 05:48:52
最好的编码如下所示
using(MySqlConnection connect = new MySqlConnection(connectionStringMySql))
using(MySqlCommand cmd = new MySqlCommand())
{
string commandLine = "SELECT id,token FROM Table WHERE id = @id AND token = @token;";
cmd.CommandText = commandLine;
cmd.Parameters.AddWithValue("@id", id);
cmd.Parameters.AddWithValue("@token", token);
cmd.Connection = connect;
cmd.Connection.Open();
using(msdr = cmd.ExecuteReader())
{
//do stuff.....
} // <- here the DataReader is closed and disposed.
} // <- here at the closing brace the connection is closed and disposed as well the commandusing statement将关闭并释放您的连接以及命令对象。不需要在MySqlConnection或MySqlDataReader上显式调用Close,因为using语句也会在连接的打开和关闭之间的代码中触发异常的情况下为您执行此操作
在原始代码中,只需使用命令、datareader或连接本身关闭一次连接就足够了,因为它们使用相同的对象实例,但是如果出现异常,则代码无法关闭连接,从而可能会出现“打开的连接太多”的问题
C# 8.0的更新
在这个版本的语言中,using语句有一个很小但很有用的增强。它被称为using declaration
有了这个更改,上面的代码就可以编写出来,去掉using块周围的花括号
using MySqlConnection connect = new MySqlConnection(connectionStringMySql);
using MySqlCommand cmd = new MySqlCommand();
string commandLine = "SELECT id,token FROM Table WHERE id = @id AND token = @token;";
.....
cmd.Connection.Open();
using msdr = cmd.ExecuteReader();
//do stuff.....当该方法退出时,所有的using声明都将处理它们的已声明变量
发布于 2013-06-03 05:51:52
如果在方法中使用此代码,最好关闭数据读取器和数据连接
https://stackoverflow.com/questions/16887621
复制相似问题