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

4

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

我想自己测试一下,但我不知道在抛出异常时如何确定连接是打开还是关闭。

谢谢!


如果它是打开的,那么它就不是关闭的...在创建连接的地方设置断点,进行可空语句并使用它。然后应该会出现异常,从那里悬停在连接实例上并查找状态。如果您打开或关闭它,它将处于打开状态...如果它是打开的,您可以添加一个finally块来关闭它。VB.NET在Try/Catch中如果抛出异常,SqlConnection会自动关闭吗? 不会... - Trevor
如果你的对象不是空的,那么答案就是否定的,它不会。 - Trevor
1
@Saleem,“SqlConnection是一个托管对象”,我不同意。它是一个非托管对象。当您打开连接时,SqlConnection不受GC的直接控制,它将使用服务器上的资源和可能的其他非网络资源。此外,如果建立太多连接并且没有正确关闭/处理它们,则GC在这一点上会被洗脑,不知道该怎么处理它们。SqlConnection实现了IDisposable,所以请处理它们 :) - Trevor
谢谢,我已经阅读、反复阅读、再次阅读并反复阅读了一段时间关于所有我想要的连接方面的内容 :) 感谢您的帖子!@Saleem - Trevor
@Codexer,你说:“SqlConnection实现了IDisposable接口,所以要处理它们。”这意味着我们应该在任何实现IDisposable接口的对象上调用Dispose方法。你是这个意思吗? - Scott Marcus
显示剩余15条评论
1个回答

5

不需要。 这就是为什么您希望在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

@Scott Marcus,我不太赞同你的说法。如果代码中抛出了一个非 SqlException 的异常,这仍然会引发另一个未处理的异常 :) - Trevor
你会注意到我的回答包含了伪代码。OP并不是在问正确捕获异常的方法。我将代码限制在相关信息范围内。 - Scott Marcus
同意,“我自己会尝试测试,但是我不知道如何判断连接是否打开或关闭”,那么提供如何测试的方法怎么样? - Trevor
那不是问题,答案不需要测试。它是正确的。我还应该提供如何测试对象是否已实例化的说明吗?那不是问题。 - Scott Marcus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接