.Net:在这个例子中,我的连接是通过Dispose关闭的吗?

Joh*_*ohn 5 c# ado.net

这是我的示例的简化版本:

using (DbCommand cmd = new SqlCommand("myProcedure", (SqlConnection)DataAccessHelper.CreateDatabase().CreateConnection()) { CommandType = CommandType.StoredProcedure })
{
    cmd.Connection.Open();
    using(IDataReader dr = cmd.ExecuteReader())
        doWork(dr);
}
Run Code Online (Sandbox Code Playgroud)

处理命令时,连接是否已关闭?或者我是否需要首先使用语句进行连接,然后在闭包中创建命令?

Jam*_*are 11

如果希望阅读器关闭连接,可以使用ExecuteReader()的重载:

...
using (IDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) 
...
Run Code Online (Sandbox Code Playgroud)

默认情况下,配置阅读器不会释放连接.- 有关更多信息,请参阅MSDN ...

为了解决Close()vs 的问题Dispose(),MSDN声明:

如果DbConnection超出范围,则不会关闭.因此,您必须通过调用Close或Dispose显式关闭连接,这在功能上是等效的.

因此,不需要必须设置自闭合连接.主要区别在于可以重新打开关闭的连接,但是不能打开连接.这样做的主要附加工作Dispose()是设置内部,null因为连接超出范围,所以内部效果不会太大.