2010-11-18 71 views
1
using (SqlConnection sqlConn = new SqlConnection(XYZ.Globals.ConnectionString)) 
{                     
    using (SqlDataAdapter adapter = new SqlDataAdapter())        
    {                     
     SqlCommand command = new SqlCommand("selCompanies", sqlConn)  
     {                   
      CommandType = CommandType.StoredProcedure        
     };                  
     command.Parameters.AddRange(searchParams.ToArray());       
     adapter.SelectCommand = command;            
     DataSet ds = new DataSet();             
     adapter.Fill(ds);                

     return ds;                 
    }                     
}                      
                         Do I need to wrap the `adapter.fill()` in try catch finally block? 
+1

只有抓住它,如果你能處理它拋出的任何東西。 – 2010-11-18 19:41:17

+0

上面的代碼片段缺少打開和關閉數據庫連接的語句。在清理代碼的同時,我刪除了它們。 – 2010-11-18 19:42:37

回答

0

這取決於此代碼是否包裝在更高級別的異常處理。您希望在這個邏輯中處理錯誤的範圍 - 通常這是針對給定的「邏輯塊」,而不是針對每個函數調用。處理數據庫錯誤一個好主意。

無論如何,你需要在你的SqlCommand上有另一個using,否則你會泄漏它。

+0

如果我用using語句包裝SqlCommand,那麼當拋出異常時,不會有任何泄漏。這是正確的嗎? – 2010-11-18 19:46:03

+0

@全金屬 - 是的,如果這是你的完整邏輯。 – 2010-11-18 19:46:30

+0

事實上,'SqlCommand'不會泄漏(看看Reflector)。當然,你是對的,*原則上,所有'IDisposable'都應該是'使用'。 (例如,'SqlCeCommand',*不會泄露,如果處理不當......) – Heinzi 2010-11-18 19:46:39

1

只有當你可以處理拋出的任何異常時,你纔會在try/catch中包裝東西。如果不能,則無需將其放入try/catch區塊。

using聲明相當於try/finally塊。

0

同樣適用這個adapter.Fill()來的.NET代碼的任何其他行:

如果你有一個很好的理由捕捉和處理一個特定的異常,然後抓住它和處理它。如果你沒有很好的理由,不要抓住它。

我不明白爲什麼這個特定的行應該以特定的方式進行錯誤處理。

1

問題將是如果出現問題,我會採取什麼不同的措施。通常,正確的行動是讓異常向上 - 畢竟,你不是預計是一個例外,所以你不能做任何有用的事情。這裏唯一的微妙之處是IDisposable,在那裏你主動想要清理東西;所以using報表之類的東西SqlConnectionSqlCommandSqlDataReader等都是理想的(但是,這是try/finally,不try/catch)。所以我會做巡演代碼的主要變化是處置命令:

using (SqlDataAdapter adapter = new SqlDataAdapter()) 
using (SqlCommand command = new SqlCommand("selCompanies", sqlConn)) 
{ 
    command.CommandType = CommandType.StoredProcedure; 
    //...snip... 
} 
+0

我想確保如果出現問題,我會關閉連接。我的代碼片段會保證嗎? – 2010-11-18 19:47:25

+0

+1。我現在在應用程序中處理這個問題,人們不會以確定性的方式處理SQLCommand對象。 – 2010-11-18 19:47:37

+0

謝謝馬克,現在我明白了。 「使用」語句會生成try,最後如果我使用了一個IDisposable對象,那麼它將被正確處理掉。另一方面,如果要顯式處理異常,最後使用try catch。 – 2010-11-18 19:53:03

0

你只需要在這裏趕上從填充物中的異常,如果你有錯誤處理,這將需要連接或命令是在範圍。

另外,從技術上講,只要您退出連接的使用塊,適配器和命令就會超出範圍。在很多情況下,這可能足以釋放這些資源(在大多數場景中,連接是最寶貴的資源,因爲它會在數據庫服務器上創建開銷)。儘管如此,這並不會讓人傷心,特別是如果您要爲同一個內聯創建多個命令或適配器。