VB.NET如果引发异常,SqlConnection是否会在Try/Catch中自动关闭?

VB.NET如果引发异常,SqlConnection是否会在Try/Catch中自动关闭?,vb.net,sqlconnection,Vb.net,Sqlconnection,没有找到确切的问题/答案。在VB.NET中,如果我在Try/Catch块中打开一个SqlConnection,并抛出一个异常(正确捕获),该连接是隐式关闭的,还是必须关闭它?(如果尝试失败,它会被打开吗?) 我自己会“测试”这个,但我真的不知道在抛出异常时如何判断连接是打开的还是关闭的 谢谢 否。这就是为什么要在try/catch之前声明连接变量,并在其中添加finally,以确保有一个可以关闭和释放连接的位置: Dim con As New SqlClientConnection( . .

没有找到确切的问题/答案。在VB.NET中,如果我在Try/Catch块中打开一个SqlConnection,并抛出一个异常(正确捕获),该连接是隐式关闭的,还是必须关闭它?(如果尝试失败,它会被打开吗?)

我自己会“测试”这个,但我真的不知道在抛出异常时如何判断连接是打开的还是关闭的


谢谢

否。这就是为什么要在try/catch之前声明连接变量,并在其中添加finally,以确保有一个可以关闭和释放连接的位置:

 Dim con As New SqlClientConnection( . . .)

 Try
      ' DB Operations (create, read, update, delete) here
      con.open()

 Catch SqlClientException (ex)

     ' Deal with exception
 Finally
      ' Code here will always run, whether or not the try code succeeded
      ' or if you wound up in a catch block. You can safely call .close()
      ' or (as shown below) .dispose() because if the connection is already
      ' closed/disposed, the call doesn't do anything.


      ' Dispose is what you want - it will not only close the
      ' connection, but it will release the .NET reference to
      ' the remote resource, freeing up that resource (the database
      ' in this case) to serve other clients.

      con.Dispose()

 End Try

如果它是打开的,它就不会关闭。。。在创建连接的位置放置一个断点,生成一个可为null的语句并使用它。然后,您应该有一个异常,然后将鼠标悬停在连接实例上并查找状态。如果您打开或关闭它,它将是打开的。。。如果finally块打开,可以添加finally块以将其关闭
VB.NET如果引发异常,SqlConnection是否会在Try/Catch中自动关闭?
no…谢谢Codexer。如果我在Finally块中添加conn.close()(或.Dispose()),而连接当时未打开,是否会引发另一个错误,或者是否正常?不,仅当对象不存在时。。。所以答案是不会的……SqlConnection是一个托管对象,在它超出范围后不久,GC就将其标记为收集。所以,是的,连接将在稍后的某个时间关闭,GC将收集它。但是最好的做法是手动关闭它,以便通过其他请求重新打开它。我是说物理连接。@Saleem
SqlConnection是一个托管对象,我不同意。它是一个未管理的对象。
SqlConnection
不受GC的直接控制,当您打开连接时,它将使用服务器上的资源以及其他可能的非网络资源。此外,如果连接到多个连接,但没有正确关闭/处理它们,GC将在此时对如何处理它们进行洗脑。
SqlConnection
实现了
IDisposable
,所以请处理它们:)@Scott Marcus
这是正确的答案,我不同意。如果从代码中抛出一个非SqlException,这仍然会抛出另一个未处理的异常:)您会注意到我的答案包含伪代码。OP没有问捕捉异常的正确方法是什么。我将代码限制为相关信息。同意,
会自己“测试”这个,但我真的不知道如何判断连接是打开的还是关闭的
如何提供测试?这不是问题,答案也不需要测试。没错。我应该提供如何测试对象是否实例化的说明吗?这不是问题所在。