0

这是我在 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

我想知道是不是因为我没有关闭这个连接。

4

2 回答 2

6

最好的编码如下

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 command

using 语句将使您的连接以及命令对象保持关闭和处置。无需在 MySqlConnection 或 MySqlDataReader 上显式调用 Close,因为 using 语句也会为您执行此操作,以防您的代码在连接的打开和关闭之间触发异常

在您的原始代码中,只需使用命令、数据读取器或连接本身关闭一次连接就足够了,因为它们使用相同的对象实例,但是如果您有异常,那么您的代码将无法关闭连接,因此您冒“打开的连接太多”问题的风险

C# 8.0 的更新
在这个版本的语言中,使用语句有一个小而有用的增强。它被称为使用声明

通过此更改,可以编写上面的代码,删除 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-02T21:48:51.503 回答
0

如果您在方法中使用此代码,最好关闭数据读取器以及数据连接

于 2013-06-02T21:51:52.027 回答