9

我一直在为这个问题找到相互矛盾的结果。让我们看一下运行 SQL 查询的 C# 代码:

using (SqlConnection cn = new SqlConnection(strConnectString))
{
    cn.Open();

    using (SqlCommand cmd = new SqlCommand(strSQL, cn))
    {
        cmd.ExecuteNonQuery();
    }

    //Do I need to call?
    cn.Close();
}

我需要最后打电话cn.Close()吗?我问的原因是,在一个流量很大的网络应用程序中,我用完了池中的连接。

4

3 回答 3

11

此处使用的using关键字:

using (SqlConnection cn = new SqlConnection(strConnectString))
{
    // Stuff
}

简称:

SqlConnection cn = null;
try
{
    cn = new SqlConnection(strConnectString);
    // Stuff
}
finally
{
    if (cn != null) cn.Dispose();
}

cn.Dispose()将在超出范围后立即调用,这又会立即关闭连接(因为 SqlConnection.Dispose() 就是这样做的)。cnusing

更新

这不应与垃圾收集相混淆。GC 在 .NET 中是不确定的,这正是引入IDisposable接口和Dispose 模式的原因。 IDisposable允许及时、确定地释放昂贵的资源。

于 2013-03-21T02:38:21.243 回答
1

Using使用语句时不需要关闭连接。

Scott hanselman 在这里解释了为什么 Using 语句比眼中的锋利棒和 SqlConnection 重构示例更好

在一个流量很大的网络应用程序中,我用完了一个池中的连接。

确保您使用相同的连接字符串,这样 SQL 将使用连接池。

连接是立即关闭,还是在垃圾收集器到达时关闭

编辑:

Dispose 模式用于提供资源的确定性销毁。由于 .net 运行时垃圾收集器是不确定的(这意味着您永远无法确定运行时何时会收集旧对象并调用它们的终结器)。因此,当您正确实施 Dispose 模式时,您提供了资源的确定性释放,并且在消费者粗心并且不处置对象的情况下,终结器将清理对象。

于 2013-03-21T02:32:04.563 回答
1

using如果您使用它在内部调用,则无需关闭它Displose()

这里有一些关于usingADO.NET 中关键字的详细信息,可能值得一读。

利用 C# 中的“使用”关键字

快速搜索@SO 将引导你到这篇文章,你也可以在那里找到你的答案。

于 2013-03-21T02:37:22.957 回答