关闭空 sql 连接



我有一个关于关闭与 C# 中数据库的打开连接的问题。假设我们放弃了"using"方法,并使用try/catch/final块来打开和关闭连接。

try 
{
connection = new SqlConnection();
connection.Open();
}
catch (Exception ex)
{
// Do whatever you need with exception
}
finally
{
1.connection.Dispose();
2.if (connection != null)
{
connection.Dispose();
}
}

我这里的问题是,如果此代码段中仅发生 1( 究竟会发生什么。在释放(关闭(之前,应始终检查连接是否为 null,但如果不是,并且我们尝试关闭一个 null 的连接对象怎么办?(我对打开的连接会发生什么感兴趣,这会导致泄漏吗(

在问题中,如果在没有检查的情况下在null连接上调用connection.Dispose(),则会导致尚未处理的新异常以及随之而来的所有异常。此外,如果这样做是因为connection变量在finally块之前设置为null而没有确保连接已关闭,则可能会泄漏打开的连接......尽管实际上很少看到知道使用finally但也希望将连接设置为null的代码。

考虑到缺乏using(这是可疑的,但无论如何(,我更喜欢这种模式:

finally
{
if (connection is IDisposable) connection.Dispose();
}

这仍然可以防止connection对象中的null值*,并且更接近于模拟using模式已经在后台执行的操作。

但是请注意,您仍然缺少using块的一个重要功能,即防止在块关闭之前为变量分配nullusing块还会在单独的(隐藏(变量中保护连接,因此请确保块末尾仍有有效的引用(这是 C# 8 中的新增内容(。

*(为了完整起见,该链接推文的作者是 C# 编译器团队的负责人,所以他应该知道,而且他不是在讽刺(。