C#关闭数据库连接

时间:2016-04-02 16:21:11

标签: c# .net visual-studio

我需要在这方面有一点了解,当你打开与数据库的连接时,你可以把它打开吗?

此连接如何关闭?

这是好的做法还是不好的做法?

目前我向数据库提出了无问题的请求

oCON.Open();
oCMD.ExecuteNonQuery();
oCON.Close();

然而,我见过的一些例子是这样的,没有数据库关闭。

oCON.Open();
oCMD.ExecuteNonQuery();

这个连接如何关闭?

这是不好的做法吗?

3 个答案:

答案 0 :(得分:6)

我正在寻找副本,因为这似乎是一个常见的问题。我找到的最佳答案是this one,但是,我不喜欢给出的答案。

您应该始终关闭您的连接。数据库具有允许的有限数量的连接,并且还需要大量资源。

旧学校"确保结束的方法是使用try / catch / finally块:

SqlConnection connection;
SqlCommand command;

try 
{
    // Properly fill in all constructor variables.
    connection = new SqlConnection();
    command = new SqlCommand();

    connection.Open();
    command.ExecuteNonQuery();

    // Parse the results
}
catch (Exception ex)
{
    // Do whatever you need with exception
}
finally
{
    if (connection != null)
    {
        connection.Dispose();
    }
    if (command != null)
    {
        command.Dispose();
    }
}

但是,using语句是首选方式,因为它会自动处理对象。

try
{
    using (var connection = new SqlConnection())
    using (var command = new SqlCommand())
    {
        connection.Open();
        command.ExecuteNonQuery();

        // Do whatever else you need to.
    }
}
catch (Exception ex)
{
    // Handle any exception.
}

using语句的特殊之处在于,即使抛出异常,它仍会处理在代码执行停止之前创建的对象。它使您的代码更简洁,更易于阅读。

正如评论中christophano所提到的,当你的代码被编译成IL时,它实际上被写成try / finally块,复制了上面的内容示例

答案 1 :(得分:1)

您希望SqlConnection位于using区块中:

using(var connection = new SqlConnection(connectionString))
{
...
}

确保SqlConnection将被处置,这也将关闭它。

从您的角度来看,连接已关闭。在幕后,连接可能会或可能不会实际关闭。建立SQL连接需要时间和资源,因此在幕后这些连接不会立即关闭。他们保持开放和闲置一段时间,以便他们可以重复使用。它被称为连接池。因此,当您打开连接时,您可能不会真正打开新连接。您可能正在从连接池中检索一个。当你关闭它时,它不会立即关闭,它会回到游泳池。

这些都是在幕后处理的,它并没有改变我们明确对我们的连接所做的事情。我们总是"关闭"它们尽可能快,然后.NET Framework确定它们何时实际关闭。 (可以控制这种行为,但很少需要它。)

答案 2 :(得分:0)

使用工作单元查看存储库模式。 应该将连接上下文注入到操作数据库命令的类中。

sql执行类 - 就像存储库类所代表的 - 不应该创建连接。它不可测试并且伤害了SRP的范例。 它应该接受像构造函数中的IDbConnection对象。如果IDbConnection后面是SqlConnectionMysqlConnectionOracleConnection的实例,则存储库不应该小心。

所有ADO.NET连接对象都与IDbConnection兼容。