首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySqlDataReader关闭连接

MySqlDataReader关闭连接
EN

Stack Overflow用户
提问于 2013-06-03 05:45:14
回答 2查看 4.6K关注 0票数 0

这是我在MySql中从表中选择数据的代码:

代码语言:javascript
复制
            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();

正如您所看到的,我关闭这两个:

代码语言:javascript
复制
        msdr.Close();
        cmd.Connection.Close();

我想问我是否需要关闭这两个?或者,可以只关闭cmd.Connection.Close();

我问它的原因是,有时当我尝试选择表中的数据时会出现以下错误:Details: MySql.Data.MySqlClient.MySqlException: Too many connections

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-03 05:48:52

最好的编码如下所示

代码语言:javascript
复制
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 statement将关闭并释放您的连接以及命令对象。不需要在MySqlConnection或MySqlDataReader上显式调用Close,因为using语句也会在连接的打开和关闭之间的代码中触发异常的情况下为您执行此操作

在原始代码中,只需使用命令、datareader或连接本身关闭一次连接就足够了,因为它们使用相同的对象实例,但是如果出现异常,则代码无法关闭连接,从而可能会出现“打开的连接太多”的问题

C# 8.0的更新

在这个版本的语言中,using语句有一个很小但很有用的增强。它被称为using declaration

有了这个更改,上面的代码就可以编写出来,去掉using块周围的花括号

代码语言:javascript
复制
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声明都将处理它们的已声明变量

票数 6
EN

Stack Overflow用户

发布于 2013-06-03 05:51:52

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16887621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档