SQL连接代码

时间:2011-06-29 09:04:00

标签: c# .net sql-server-2008

这是我的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();
    }
}

3 个答案:

答案 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块也可以保证连接。