我有下面的代码来查询存储过程中的记录,但是担心我可能并没有处置我所需要的东西,也没有处置当垃圾收集器不久之后清除该对象时的处置。
我是否需要处置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(); } } }
您应该配置数据读取器和命令。如果您布置该命令,则无需单独关闭连接。理想情况下,您都应该使用一个using块:
using
using (SqlCommand cmd = new...) { // do stuff using (SqlDataReader dr = cmd.ExecuteReader()) { // do stuff } }
如果您需要异常处理,请在using块内部或周围单独进行操作-Dispose尽管使用,无需进行final调用using。
Dispose