这是我的SQL连接代码。不确定我是否已经处理了所有错误。我应该使用Try Catch阻止而不是使用吗?
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();
}
}
答案 0 :(得分:2)
从catch
的数据访问谈话中lblError
阻止告诉我你的UI代码和你的数据库代码太靠近了。我会不那样做;我的数据库代码很简单:
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详细信息。
答案 1 :(得分:1)
try/catch
块是一个好主意,因为using
不会捕获任何错误,它只会抛出异常并停止。
此外,在您的using
代码中,您无需执行以下操作:
if (con != null)
con.Close();
因为这将由using
声明处理。
答案 2 :(得分:0)
我会重新编写当前的catch块以仅捕获SQLException
- 捕捉任何 Exception
很少是正确的。这也意味着您可以生成更漂亮的输出(格式化每个单独的SQLError对象),包括总错误计数,或对您知道代码可以处理的特定错误做出反应。
异常处理的一般规则是仅捕获代码在此时可以正确处理的异常(因此通常避免捕获Exception
)。您通常会在应用中安装一个顶级“未处理的异常”处理程序,该处理程序将记录其他异常并关闭应用程序。如果您不知道异常是什么,您怎么能相信您的代码在发生时可以继续成功运行?
正如Neil所说,您不需要显式关闭连接,因为using
块也可以保证连接。