2013-05-22 44 views
2

當人們考慮關於數據庫連接的大部分時間時,他們談論的Sqlconnection來自System.Data命名空間。當我在c#中安排連接時Mysql關閉了連接(Mysqlconnection)

上次在論壇上我讀過,即使你在MySQL中使用(),你也需要調用conn.close();

對此不確定。我不確定MySQL的情況。我有一些連接到MySQL的C#代碼。

此代碼打開一些他們從未關閉的連接。我想檢查代碼。我如何驗證連接已關閉。

我的意思首先是如何驗證使用()自動關閉mysqlconnection。 其次我如何調試仍然沒有關閉連接的代碼。

有人有很好的方法來知道連接打開和沒有關閉。

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


      using (cnn) 
{ 
} 

我已經添加了此示例代碼,以瞭解是否有人可以告訴我,如果這會自動關閉連接。

回答

5

DotNet的MySql Connector的源代碼可從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(); 
    ...... 
} 

以這種方式,如果打開FAIS連接將被設置。而在你的代碼中,這不會發生,因爲你永遠不會輸入using語句。

最後,這是上面的代碼生成的IL代碼(僅增加了一個假的和無效的連接字符串)

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 

毫不令人驚訝。連接關閉並處置

+0

這是否意味着無論我使用或在using()之外打開連接。兩者都將處置並關閉連接。 – user2126670

+0

是的,它是使用內部的對象將被丟棄,你的代碼有點奇怪和危險。如果無法打開連接,則使用將無法處理和關閉。 – Steve

+0

@Steve如何從應用程序中查看IL?你使用什麼應用程序? –