2011-06-29 42 views
0

這是我的SQL連接代碼。不知道我是否處理過所有錯誤。我應該使用Try Catch塊來代替使用?SQL連接代碼

using (SqlConnection con = new SqlConnection(GetSQLConnectionString())) 
{ 
    string cmdStr = "INSERT INTO table1....."; 

    using (SqlCommand cmd = new SqlCommand(cmdStr, con)) 
    { 
     //Store parameters with values to the collection 
     cmd.Parameters.AddWithValue("NAME", NAME); 
     cmd.Parameters.AddWithValue("ID",ID); 

     try 
     { 
      con.Open(); 
      cmd.ExecuteNonQuery(); 

     } 
     catch (Exception ex) 
     { 
      lblError.Text = ex.ToString(); 
     } 

     if (con != null) 
      con.Close(); 
    } 
} 
+2

6個問題 - 無法接受 - 您需要接受一些過去的問題的答案 - 否則人們會更不願意幫助您。 – BonyT

回答

0

我會重寫你目前的catch塊只能抓到 - 抓任何Exception很少是正確的。這也意味着你可以產生漂亮的輸出(格式化每個單獨的SQLError對象),包括總錯誤計數,或者對你知道你的代碼可以處理的特定錯誤作出反應。

異常處理的一般規則是隻捕獲您的代碼可以正確處理的異常(因此一般避免捕獲Exception)。您通常會在您的應用程序中安裝一個頂級「未處理的異常」處理程序,以記錄其他異常並關閉該應用程序。如果你不知道這個例外是什麼,你怎麼能認爲你的代碼在發生時能夠繼續成功運行?

正如尼爾所說,你不需要明確關閉連接,因爲using塊也保證了這一點。

1

try/catch塊是一個好主意,因爲using不會趕上任何錯誤,它只是拋出異常並停止。

而且,在你的using代碼,你並不需要做:

if (con != null) 
    con.Close(); 

,因爲這將被using語句來處理。

+0

我不相信;它只有在這裏是有道理的,因爲該方法已經*斷裂。 –

2

有一個catch塊從數據訪問談話lblError告訴我你有你的UI代碼和你的DB代碼太靠近在一起。我會不是做到這一點;使用 「短小精悍」

using (var con = SomeUtilityCode.GetOpenConnection()) 
{ 
    string cmdStr = "INSERT INTO table1....."; 

    using (SqlCommand cmd = new SqlCommand(cmdStr, con)) 
    { 
     //Store parameters with values to the collection 
     cmd.Parameters.AddWithValue("NAME", name); 
     cmd.Parameters.AddWithValue("ID",id); 

     cmd.ExecuteNonQuery(); 
    } 
} 

或者是一些很多清潔:我的數據庫的代碼將只

using (var con = SomeUtilityCode.GetOpenConnection()) 
{ 
    con.Execute("INSERT INTO table1.....", new { NAME = name, ID = id }); 
} 

和我的UI代碼將

try 
{ 
    someObject.SomeSensibleMethod(NAME, ID); 
} 
catch (Exception ex) 
{ 
    ShowError(ex); 
} 

其中ShowError告訴用戶關於這個問題(或許已經過消毒),而不需要外界的操作來了解UI細節。