2

当人们大多数时候考虑数据库连接时,我认为 Sqlconnection 来自 System.Data 命名空间。

上次在论坛上,我读到即使您在 MySQL 中使用(),您也需要调用 conn.close();

不确定这一点。对于 MySQL,我不确定。我有一些连接到 MySQL 的 C# 代码。

此代码打开了一些他们从未关闭过的连接。我想检查代码。我如何验证连接已关闭。

我的意思首先是如何验证 using() 自动关闭 mysqlconnection。其次,我如何调试仍然没有关闭连接的代码。

有人有好方法知道连接在哪里打开和关闭。

  MySqlConnection cnn = new MySqlConnection(Globals.CONNSTRING);
            cnn.Open();


            using (cnn)
{
}

我添加了此示例代码以了解是否有人可以告诉我这是否会自动关闭连接。

4

1 回答 1

6

MySql Connector for Dot Net 的源代码可从MySql Site获得。如果您下载它们并查看 MySqlConnection 的 Dispose 方法,您会看到:

protected override void Dispose(bool disposing)
{
  if (State == ConnectionState.Open)
    Close();
  base.Dispose(disposing);
}

但我必须指出,这是 6.5.6 版本的来源。我找不到 6.3.6 版的源代码。但是,以前的版本 (6.1.6) 具有相同的代码。

看着你的代码,我觉得它有点奇怪和危险。
通常常见的使用模式如下

using(MySqlConnection cnn = new MySqlConnection(Globals.CONNSTRING))
{
    cnn.Open();
    ......
}

这样,如果 Open fais 连接将被释放。而在您的代码中,这不会发生,因为您从未输入 using 语句。

最后,这是您上面的代码生成的 IL 代码(仅添加了 FAKE 和无效的连接字符串)

IL_0000:  ldstr       "test"
IL_0005:  newobj      MySql.Data.MySqlClient.MySqlConnection..ctor
IL_000A:  stloc.0     // cnn
IL_000B:  ldloc.0     // cnn
IL_000C:  callvirt    System.Data.Common.DbConnection.Open
IL_0011:  ldloc.0     // cnn
IL_0012:  stloc.1     // CS$3$0000
IL_0013:  leave.s     IL_001F
IL_0015:  ldloc.1     // CS$3$0000
IL_0016:  brfalse.s   IL_001E
IL_0018:  ldloc.1     // CS$3$0000
IL_0019:  callvirt    System.IDisposable.Dispose
IL_001E:  endfinally  

那就不足为奇了。连接已关闭并处置

于 2013-05-22T08:19:30.283 回答