CA2000对象'comm'未沿所有异常路径放置

时间:2011-03-08 21:48:48

标签: c# asp.net

我在VS 2010中的DAL中有很多这样的方法。当我运行“新”代码分析选项时,我收到消息 - 警告CA2000对象'comm'未沿所有异常路径放置。在对所有引用超出范围之前,在对象'comm'上调用System.IDisposable.Dispose。

我知道我可以为SQLCommand使用另一个using语句,但是如果喜欢我喜欢使用Try / Finally块。我的理解是Finally块最后执行并进行清理。我的处理电话有没有人看到任何错误?

  public List<Product> GetAllProducts()
    {

        List<Product> prodList = new List<Product>();
        using (SqlConnection connection = new SqlConnection(GetConnection()))
        {
            SqlCommand comm = new SqlCommand("GetAllProducts", connection);
            connection.Open();
            comm.CommandType = CommandType.StoredProcedure;
            SqlDataReader dr = comm.ExecuteReader();
            try
            {
                while (dr.Read())
                {
                    Product obj = new Product();
                    obj.ProductID = Convert.ToInt32(dr["ProductID"].ToString());
                    obj.Product = dr["Product"].ToString();
                    //etc....                                                                       

                    prodList.Add(obj);
                }
            }
            finally
            {
                comm.Dispose();
                dr.Close();
            }
        }

        return prodList;
    }

}

3 个答案:

答案 0 :(得分:1)

如果这三个陈述中的任何一个抛出异常,comm将不会被处置。

        connection.Open();
        comm.CommandType = CommandType.StoredProcedure;
        SqlDataReader dr = comm.ExecuteReader();

你的尝试块也需要包含这些陈述。

答案 1 :(得分:1)

在命令和dataReader周围放置一个使用块,以便始终处理它们。

public List<Product> GetAllProducts()
{
    List<Product> prodList = new List<Product>();
    using (SqlConnection connection = new SqlConnection(GetConnection()))
    {
        using (SqlCommand comm = new SqlCommand("GetAllProducts", connection))
        {
            connection.Open();
            comm.CommandType = CommandType.StoredProcedure;
            using (SqlDataReader dr = comm.ExecuteReader())
            {
                try
                {
                    while (dr.Read())
                    {
                        Product obj = new Product();
                        obj.ProductID = Convert.ToInt32(dr["ProductID"].ToString());
                        obj.Product = dr["Product"].ToString();
                        //etc....                                                                       

                        prodList.Add(obj);
                    }
                }
            }
        }
    }

    return prodList;
}

答案 2 :(得分:0)

        List<Measure_Type> MeasureList = new List<Measure_Type>();
        SqlConnection conn = null;            

        SqlDataReader rdr = null;
        SqlCommand cmd = null;
        try
        {
            conn = new SqlConnection();
            conn.ConnectionString = System.Configuration.ConfigurationManager.AppSettings["Conn"];
            conn.Open();
            cmd = new SqlCommand("SELECT Measure_ID, Mea_Name FROM MeasureTable WHERE IsActive=1", conn);

            rdr = cmd.ExecuteReader();
            if (rdr.HasRows == true)
            {
                while (rdr.Read())
                {
                    MeasureTypeList.Add(new Measure_Type { MeasureTypeID = Convert.ToInt32(rdr[0]), MeasureTypeName = rdr[1].ToString() });
                }
            }
        }

        catch (Exception ex)
        {
            ExceptionPolicy.HandleException(ex, "Log");
        }
        finally
        {
            cmd.Dispose();
            // close the reader
            if (rdr != null) { rdr.Close(); }
            // Close the connection
            if (conn != null) { conn.Dispose(); }
        }
        return MeasureTypeList;

在try块中创建conn = new SqlConnection();,然后打开它以解决此错误。