如果我将SQLConnection包装在Using语句中,我需要关闭它吗?还是使用结束会处理它?
using cn as new system.data.sqlclient.sqlconnection()
cn.open
'{do a bunch of other stuff with commands and datareaders here}
cn.close 'Do I need this?
end using
如果我将SQLConnection包装在Using语句中,我需要关闭它吗?还是使用结束会处理它?
using cn as new system.data.sqlclient.sqlconnection()
cn.open
'{do a bunch of other stuff with commands and datareaders here}
cn.close 'Do I need this?
end using
退出 using
代码块会调用相关对象(例如您的示例中的cn
)的 .Dispose()
方法,对于 SqlConnection
对象来说,这将关闭连接和任何打开的资源。
更准确地说,调用Dispose或Close方法会将底层物理连接标记为“未使用”,但并不会真正关闭它。一个“未使用”的连接如果尚未被物理关闭,则可以用于连接池。因此,调用Dispose会将连接返回到连接池。
虽然 SQL 的 Dispose 方法确实会关闭连接(根据 darin 的说法,最终会关闭),但你应该保留 Close 方法的调用。原因在于,你不能依赖于 Dispose 的底层实现来调用 close 方法。而且对于那些编写过非托管语言的人来说,看到 Open 没有 Close 就像看到 New 没有 Delete 一样。这是我觉得代码有问题的地方。
"Using块的行为类似于Try...Finally结构,其中Try块使用资源,而Finally块处理其释放。因此,无论如何退出块,Using块都保证释放资源。即使是未处理的异常,这也是正确的,但StackOverflowException除外。"
https://msdn.microsoft.com/en-us/library/htd05whh.aspx
使用using只是try/finally的一种简写方式。以下代码与您发布的代码等效:
Try
SqlConnection cn as new system.data.sqlclient.sqlconnection()
cn.open
'{do a bunch of other stuff with commands and datareaders here}
cn.close 'Do I need this?
Finally
cn.Dispose()
End Try
Dispose方法旨在处理所有资源清理工作,对于连接来说,它将关闭连接。