既然 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();
}
}
}
SqlCommand
对象将不会释放SqlConnection
。这很容易测试。https://dev59.com/G3VD5IYBdhLWcg3wL4cA#60934 - arcain