2

人々がデータベース接続について考えるとき、ほとんどの場合、Sqlconnection は System.Data 名前空間内にあると話します。

前回フォーラムで、MySQL で using() を使用している場合でも、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 サイトから入手できます。それらをダウンロードして 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 が失敗した場合、接続は破棄されます。コードでは 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 に答える