是否使用此函数处理SqlConnection

时间:2015-11-13 16:25:54

标签: c# dispose sqlconnection

public CategorieEquipement Select(int NoType)
{
        SqlConnection cx = new SqlConnection(WebConfigurationManager.ConnectionStrings["SQLConnect"].Connection    String);
        SqlDataReader reader;

        CategorieEquipement lstCategorie = new CategorieEquipement();
        try
        {
            cx.Open();
            SqlCommand com = new SqlCommand("SELECT_CategorieEquip", cx);
            com.CommandType = System.Data.CommandType.StoredProcedure;
            com.Parameters.AddWithValue("@where",NoType);
            reader = com.ExecuteReader();

            while (reader.Read())
            {
                lstCategorie.CodeRef = reader["CodeRef"].ToString();
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine("SELECT ERROR : " + ex.ToString());
            return null;
        }
        finally
        {
            if (cx != null)
            {
                cx.Close();
            }
        }
        return lstCategorie;
    }
}

我的问题是,如果删除finally块代码,垃圾收集器在处理SQlConnection对象时是否会关闭连接?

我知道明确是一个更好的做法,但我的同事并不同意。

2 个答案:

答案 0 :(得分:2)

  

垃圾收集器在处理时会关闭连接   SQlConnection对象?

垃圾收集器不负责在对象上调用Dispose,通常在Finalizer中调用Dispose,然后GC才能正确处理对象。

需要注意的一件重要事情是,您无法预测垃圾收集过程何时运行,因此最好明确部署对象(实现IDisposable

就数据库连接而言,该方法应尽可能晚地开放,并尽早关闭。

在上述情况下,cx.Close();应该足够了,您也可以致电cx.Dispose但更好的方法SqlConnection括起来using statement阻止。

这将转化为try/finally块,并确保SqlConnection处置。

答案 1 :(得分:1)

垃圾收集将处理它,但由于它是非确定性的,你不知道它什么时候会这样做。

C#提供using结构来处理非托管代码,建议使用它:

using (SqlConnection cx = new SqlConnection(WebConfigurationManager.ConnectionStrings["SQLConnect"].ConnectionString);)
{

}

告诉您的同事他们应该在using中包装实现IDisposable接口的任何对象实例,以便以确定的方式处理它们,以确保正确管理应用程序资源并避免出现问题就像内存泄漏一样。