如果我在using语句中有连接,那么如果在using语句中发生异常,是否会关闭连接?

时间:2014-04-22 22:34:39

标签: c# database exception connection using

以下代码没有任何类型的错误处理。

我很好奇。就位而言,抛出异常时是否会关闭using语句中创建的连接?或者连接是否会保持打开状态,因为它从未明确关闭?

public override string ResetToDefault() {
    string result;
    using (var cn = HostFacade.GetDbConnection())
    {
        cn.Open();
        DbProvider.Transaction = cn.BeginTransaction();

        // Do something here that throws an unhandled exception.

        DbProvider.Transaction.Commit();
        cn.Close();
    }
    return result;
}

编辑:HostFacade.GetDbConnection返回的连接是IDbConnection。这里假设它被实现为SqlConnection对象是安全的。

2 个答案:

答案 0 :(得分:1)

是的,因为编译器将using语句扩展为try...finally块。您的代码与此相同:

SqlConnection cn = null;

try {
    cn = HostFacade.GetDbConnection();
    cn.Open();
    // .. rest of the code here
}
finally {
    if (cn != null)
        cn.Dispose();
}

Dispose来电将关闭连接。

CLR保证finally块将执行..除非在非常特定的情况下(例如调用FailFast IIRC)。

答案 1 :(得分:0)

这取决于您正在运行的特定库的作者对Dispose()的实现。

.NET Framework中内置的库(就像你的例子一样)无疑会清理所访问的资源,比如SqlConnection,但你应该在做任何事情之前首先验证文档。