小编典典

C#SQL处置什么

sql

我有下面的代码来查询存储过程中的记录,但是担心我可能并没有处置我所需要的东西,也没有处置当垃圾收集器不久之后清除该对象时的处置。

我是否需要处置SqlDataReader,因为它位于try catch块中?

我需要同时运行cmd.Dispose和cmd.Connection.Close还是一个推断另一个?

垃圾收集器会最终以任何方式处置所有这些对象(可能不够及时)还是可能由于使用非托管代码而隐式要求处置这些对象?

public void GetData(string studentID)
    {
        SqlCommand cmd = new SqlCommand("sp_stored_proc", 
                new SqlConnection(Settings.Default.connectionString)) 
                { CommandType = CommandType.StoredProcedure };
        try
        {
            cmd.Connection.Open();
            cmd.Parameters.AddWithValue("@student_id", studentID);
            SqlDataReader dr = cmd.ExecuteReader();

         //do something with the data

            if (dr != null)
                dr.Dispose();
        }
        catch
        {
            //error handling
        }
        finally
        {
            if (cmd != null)
            {
                cmd.Dispose();
                cmd.Connection.Close();
            }

        }

    }

阅读 250

收藏
2021-03-23

共1个答案

小编典典

您应该配置数据读取器和命令。如果您布置该命令,则无需单独关闭连接。理想情况下,您都应该使用一个using块:

using (SqlCommand cmd = new...)
{
    // do stuff
    using (SqlDataReader dr = cmd.ExecuteReader())
    {
        // do stuff
    }
}

如果您需要异常处理,请在using块内部或周围单独进行操作-Dispose尽管使用,无需进行final调用using

2021-03-23