我需要一个在这方面有点理解,当你打开一个连接到数据库可以让它打开?C#关闭数据库连接
此连接如何关闭?
是好的做法还是不好的做法?
目前,我有到工作没问题
oCON.Open();
oCMD.ExecuteNonQuery();
oCON.Close();
然而一些我所看到的例子是这样的事,没有数据库关闭数据库的请求。
oCON.Open();
oCMD.ExecuteNonQuery();
此连接将如何关闭?
这是不好的做法?
我需要一个在这方面有点理解,当你打开一个连接到数据库可以让它打开?C#关闭数据库连接
此连接如何关闭?
是好的做法还是不好的做法?
目前,我有到工作没问题
oCON.Open();
oCMD.ExecuteNonQuery();
oCON.Close();
然而一些我所看到的例子是这样的事,没有数据库关闭数据库的请求。
oCON.Open();
oCMD.ExecuteNonQuery();
此连接将如何关闭?
这是不好的做法?
我正在寻找重复,因为这似乎是一个常见的问题。我发现的最佳答案是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
块,复制上面示例中所做的操作。
您希望您的SqlConnection
是在一个using
块:
using(var connection = new SqlConnection(connectionString))
{
...
}
这确保了SqlConnection
将被布置,这也将关闭它。
从您的角度来看,连接已关闭。在幕后,连接可能会或可能不会实际关闭。建立SQL连接需要花费时间和资源,因此幕后的连接不会立即关闭。他们保持开放和闲置一段时间,以便他们可以重复使用。它被称为连接池。所以当你打开一个连接时,你可能不会真的打开一个新的连接。您可能正在从连接池中检索一个。当你关闭它时,它不会立即关闭,它会回到游泳池。
这些都是在幕后处理的,它不会改变我们明确对待我们的连接所做的事情。我们总是尽快“关闭”它们,然后.NET Framework确定它们何时实际关闭。 (可以对这种行为有一些控制,但很少有必要。)
查看仓库模式和工作单元。 连接上下文应该注入到对数据库执行命令的类中。
sql执行类 - 就像存储库类所表示的 - 不应创建连接。这不是可测试的,并且伤害了SRP的范例。 它应该像构造函数中那样接受一个IDbConnection
对象。如果IDbConnection
是SqlConnection
,MysqlConnection
或OracleConnection
的实例,则存储库不应该小心。
所有的ADO.NET连接对象都与IDbConnection
兼容。
实际上,使用''是从一开始就有的,它在2001年已经出现在C#1中。 –
哇,看看那个。那么我会编辑我的答案。 – krillgar
很好的答案。值得一提的是,using语句实际上被编译器编写为try/finally块。 – christophano