SqlCommand with using语句

时间:2014-04-20 18:16:29

标签: c# sqlconnection sqlcommand using-statement

我在大多数样本中看到SqlCommand像这样使用

using (SqlConnection con = new SqlConnection(CNN_STRING))
{
    using (SqlCommand cmd = new SqlCommand("Select ID,Name From Person", con))
    {
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        da.Fill(ds);           
        return ds;
    }
}

我知道为什么我们使用“使用”声明。但是SqlCommand没有包含Close()方法,所以我们应该在using语句

中使用它

2 个答案:

答案 0 :(得分:26)

因为它还实现了IDisposable

Using语句的目的是当控件到达使用结束时它将配置使用块的对象并释放内存。它的目的不仅仅是自动连接关闭,基本上它会配置连接对象,显然连接也因此而关闭。

其目的是释放我们在Using语句中使用的资源。

根据MSDN:

  

通常,当您使用IDisposable对象时,应该在using语句中声明并实例化它。 using语句以正确的方式调用对象上的Dispose方法,并且(如前所示使用它时)一旦调用Dispose,它也会导致对象本身超出范围。在using块中,该对象是只读的,不能修改或重新分配。

     

using语句确保即使在对象上调用方法时发生异常,也会调用Dispose。通过将对象放在try块中然后在Dispose块中调用finally,可以获得相同的结果;实际上,这就是编译器如何翻译using语句。前面的代码示例在编译时扩展为以下代码(注意额外的花括号以创建对象的有限范围):

注意:

  

您可以实例化资源对象,然后将变量传递给using语句,但这不是最佳做法。在这种情况下,在控制离开使用块之后,对象仍然在范围内,即使它可能不再能够访问其非托管资源。换句话说,它将不再完全初始化。如果您尝试使用using块之外的对象,则可能会导致抛出异常。因此,通常最好在using语句中实例化对象,并将其范围限制为使用块。

答案 1 :(得分:5)

SqlCommand确实实现了IDisposableusing语句在使用块完成之前会调用.Dispose()。我不确定SqlCommand.Dispose()做了什么,但最好在你完成的实例上调用.Dispose(),也许它会清理数据库连接。