2008-09-13 104 views
48

我可以有效使用這種方法嗎?SqlCommand.Dispose是否關閉連接?

using(SqlCommand cmd = new SqlCommand("GetSomething", new SqlConnection(Config.ConnectionString)) 
{ 
    cmd.Connection.Open(); 
    // set up parameters and CommandType to StoredProcedure etc. etc. 
    cmd.ExecuteNonQuery(); 
} 

我擔心的是:將所述的SqlCommand的Dispose方法(離開使用塊時被調用)關閉基礎SqlConnection對象或不?

+0

處理完SqlCommand com之後,它的Connection實例將被解除連接(不被任何東西使用)。所以一旦GarbageCollector完成了SqlConnection實例,連接是不會被丟棄的?我認爲它會是,因爲連接在這裏僅由cmd引用。 – mecek 2013-10-22 21:41:09

+0

那麼在那種情況下,@Mecek,內存將被釋放更難,因爲它會通過終止,這將促使它從gen0到gen1,我猜。 – 2013-10-23 13:32:50

回答

97

不,處置SqlCommand不會影響連接。更好的方法是還包裹SqlConnection在使用塊,以及:

using (SqlConnection conn = new SqlConnection(connstring)) 
{ 
    conn.Open(); 
    using (SqlCommand cmd = new SqlCommand(cmdstring, conn)) 
    { 
     cmd.ExecuteNonQuery(); 
    } 
} 

否則,連接是不變的事實,即使用它配置(也許這就是你想要什麼命令? )。但請記住,連接應該被丟棄,並且可能比處理命令更重要。

編輯:

我只是測試這樣的:當使用塊退出

SqlConnection conn = new SqlConnection(connstring); 
conn.Open(); 

using (SqlCommand cmd = new SqlCommand("select field from table where fieldid = 1", conn)) 
{ 
    Console.WriteLine(cmd.ExecuteScalar().ToString()); 
} 

using (SqlCommand cmd = new SqlCommand("select field from table where fieldid = 2", conn)) 
{ 
    Console.WriteLine(cmd.ExecuteScalar().ToString()); 
} 

conn.Dispose(); 

第一命令被設置。連接仍然開放,對第二條命令有好處。

所以,配置命令絕對不會處理它使用的連接。

+0

在創建命令之前,您不需要打開連接嗎?使它稍微清潔器是這樣的: 使用(SqlConnection的康恩=新的SqlConnection(CONNSTRING)) 使用(的SqlCommand CMD =新的SqlCommand(cmdstring,康涅狄格州)) { conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); } – 2009-05-13 12:48:05

10

SqlCommand.Dispose將不夠用,因爲許多SqlCommand可以(重新)使用相同的SqlConnection。將焦點集中在SqlConnection上。

-10

我使用這種模式。我在我的應用程序的某個地方有這樣的私有方法:

private void DisposeCommand(SqlCommand cmd) 
{ 
    try 
    { 
     if (cmd != null) 
     { 
      if (cmd.Connection != null) 
      { 
       cmd.Connection.Close(); 
       cmd.Connection.Dispose(); 
      } 
      cmd.Dispose(); 
     } 
    } 
    catch { } //don't blow up 
} 

然後,我總是創造一個try塊SQL命令和連接(但不被包裹在一個使用塊),並始終有一個finally塊爲:

finally 
    { 
     DisposeCommand(cmd); 
    } 

作爲命令對象的屬性的連接對象在這種情況下使得使用塊變得尷尬 - 但是這種模式可以完成工作而不會混淆代碼。