【问题标题】:ADO.NET and Disposing without UsingADO.NET 和不使用的处理
【发布时间】:2012-03-01 22:47:26
【问题描述】:

我有一个项目没有在任何地方使用他们的 ADO.NET 代码。我正在清理他们未关闭的连接。下面的代码是 try/catch/finally 的最佳实践吗?我也有一些包含我在命令和连接处理之间处理的 SqlTransaction。

SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["MyNGConnectDashBoardConnectionString"].ToString());
            SqlCommand cmd = new SqlCommand();
            DataSet ds = new DataSet();
            try
            {
                con.Open();
                cmd.Connection = con;

                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(ds);

            }
            catch (Exception ex)
            {
                throw ex;
            }

            finally
            {
                cmd.Dispose();
                con.Dispose();
            }

【问题讨论】:

标签: ado.net dispose


【解决方案1】:

其实在使用SqlDataAdapter.Fill(dataset)方法的时候不用担心会关闭连接。此方法在执行每个 Fill 后关闭连接。

此外,无需调用SqlCommand.Dispose(),因为命令本身没有需要清理的非托管资源。您应该关心的是是否在某个时候调用了SqlConnection.Close()。这是在填充之后完成的。

【讨论】:

    【解决方案2】:

    你所拥有的一切都很好。处置使用非托管资源的对象总是一个好主意。但是,如果您厌倦了总是显式调用 Dispose,最好的做法可能是使用 using

    using (SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["MyNGConnectDashBoardConnectionString"].ToString()))
    {
        using (SqlCommand cmd = new SqlCommand())
        {
            DataSet ds = new DataSet();
            try
            {
                con.Open();
                cmd.Connection = con;
    
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(ds);
    
            }
            catch (Exception ex)
            {
                throw; // I changed this too!
            }
        }
    }
    

    此外,如果您要“重新抛出”异常,您几乎总是只想简单地throw。如果你throw ex;,你会丢失一些堆栈跟踪。

    【讨论】:

      【解决方案3】:

      最佳做法是使用 using 而不是 try/finally :)

      但是在您的情况下,甚至不需要使用,因为Fill() 会关闭连接:

              SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["MyNGConnectDashBoardConnectionString"].ToString())
              SqlDataAdapter da = new SqlDataAdapter("your sql is here", con);
              da.Fill(ds);
      

      简单的重新抛出异常也毫无意义。如果您需要记录错误,只需按照@Cory 的建议使用普通的throw;

      【讨论】:

      • 我知道,但我无法及时更新 200 个数据库调用并对其进行测试,所以我必须使用我所拥有的。
      • 在我的回答中添加了更多细节。
      猜你喜欢
      • 2010-09-09
      • 2019-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多