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?
回答
這取決於此代碼是否包裝在更高級別的異常處理。您希望在這個邏輯中處理錯誤的範圍 - 通常這是針對給定的「邏輯塊」,而不是針對每個函數調用。處理數據庫錯誤是一個好主意。
無論如何,你需要在你的SqlCommand
上有另一個using
,否則你會泄漏它。
如果我用using語句包裝SqlCommand,那麼當拋出異常時,不會有任何泄漏。這是正確的嗎? – 2010-11-18 19:46:03
@全金屬 - 是的,如果這是你的完整邏輯。 – 2010-11-18 19:46:30
事實上,'SqlCommand'不會泄漏(看看Reflector)。當然,你是對的,*原則上,所有'IDisposable'都應該是'使用'。 (例如,'SqlCeCommand',*不會泄露,如果處理不當......) – Heinzi 2010-11-18 19:46:39
只有當你可以處理拋出的任何異常時,你纔會在try/catch
中包裝東西。如果不能,則無需將其放入try/catch
區塊。
using
聲明相當於try/finally
塊。
同樣適用這個adapter.Fill()
來的.NET代碼的任何其他行:
如果你有一個很好的理由捕捉和處理一個特定的異常,然後抓住它和處理它。如果你沒有很好的理由,不要抓住它。
我不明白爲什麼這個特定的行應該以特定的方式進行錯誤處理。
問題將是如果出現問題,我會採取什麼不同的措施。通常,正確的行動是讓異常向上 - 畢竟,你不是預計是一個例外,所以你不能做任何有用的事情。這裏唯一的微妙之處是IDisposable
,在那裏你主動想要清理東西;所以using
報表之類的東西SqlConnection
,SqlCommand
,SqlDataReader
等都是理想的(但是,這是try
/finally
,不try
/catch
)。所以我會做巡演代碼的主要變化是處置命令:
using (SqlDataAdapter adapter = new SqlDataAdapter())
using (SqlCommand command = new SqlCommand("selCompanies", sqlConn))
{
command.CommandType = CommandType.StoredProcedure;
//...snip...
}
我想確保如果出現問題,我會關閉連接。我的代碼片段會保證嗎? – 2010-11-18 19:47:25
+1。我現在在應用程序中處理這個問題,人們不會以確定性的方式處理SQLCommand對象。 – 2010-11-18 19:47:37
謝謝馬克,現在我明白了。 「使用」語句會生成try,最後如果我使用了一個IDisposable對象,那麼它將被正確處理掉。另一方面,如果要顯式處理異常,最後使用try catch。 – 2010-11-18 19:53:03
你只需要在這裏趕上從填充物中的異常,如果你有錯誤處理,這將需要連接或命令是在範圍。
另外,從技術上講,只要您退出連接的使用塊,適配器和命令就會超出範圍。在很多情況下,這可能足以釋放這些資源(在大多數場景中,連接是最寶貴的資源,因爲它會在數據庫服務器上創建開銷)。儘管如此,這並不會讓人傷心,特別是如果您要爲同一個內聯創建多個命令或適配器。
- 1. 我應該使用HTML5語法嗎?
- 2. 我應該使用帶參數或函數的方法嗎?
- 3. 我應該使用這種方法嗎?
- 4. 我應該使用replace()方法嗎?
- 5. 我應該激活c3p0語句池嗎?
- 6. 我可以使用帶有MySQLdb.Connection對象的語句嗎?
- 7. 我應該在Perl中使用帶opendir的詞法目錄句柄嗎?
- 8. 我應該在Jest循環內使用`expect`語句嗎?
- 9. 在帶有字符串長度方法的「if」語句中使用「或」語句
- 10. 如何在界面中使用帶有return語句的方法?
- 11. 我應該使用RSpec測試私有方法嗎?
- 12. 爪哇 - 使用TryCatch的方法
- 13. 我應該使用打印語句將應用程序發佈到App Store嗎?
- 14. 當使用語句應該使用?
- 15. 應該使用getInnerHtml()方法嗎?
- 16. 我們應該用分號結束T-SQL語句嗎?
- 17. 我應該使用私有函數作爲從case語句返回值的最佳方式嗎?
- 18. 我應該在控制器中使用正常的方法嗎?
- 19. 用MySQLi插入數據 - 我應該使用預準備語句嗎?
- 20. 我應該在使用IN子句時使用GROUP BY嗎?
- 21. 我應該使用Application.Lock()嗎?
- 22. 我應該使用Zend_Form嗎?
- 23. 我應該使用Umbraco嗎?
- 24. 我應該使用AJAX嗎?
- 25. 我應該使用Bootstrap嗎?
- 26. 我應該使用memcache嗎?
- 27. 我應該使用cflock嗎?
- 28. 我應該使用AutoreleasePool嗎?
- 29. 我應該使用fieldset嗎?
- 30. 我應該使用Struct嗎?
只有抓住它,如果你能處理它拋出的任何東西。 – 2010-11-18 19:41:17
上面的代碼片段缺少打開和關閉數據庫連接的語句。在清理代碼的同時,我刪除了它們。 – 2010-11-18 19:42:37