2011-06-29 41 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细节。