Vb6 在将Adodb.recordset对象设置为nothing之前,是否需要关闭该对象?

Vb6 在将Adodb.recordset对象设置为nothing之前,是否需要关闭该对象?,vb6,database-connection,adodb,Vb6,Database Connection,Adodb,在将rs.Close设置为nothing之前是否需要调用它 编辑:我们有一个全局连接,在应用程序期间保持打开状态,所有记录集对象都使用相同的连接。我在下面看到两个答案,它们谈到需要关闭记录集,以确保连接不会被挂断。对我来说,这听起来像是很多愚蠢的谈话,因为连接是由连接对象控制的,而不是记录集对象,对吗?但是如果我在这里遗漏了什么,请告诉我…是的,这不仅仅是强制垃圾收集,它还告诉服务器连接正在终止,这避免了多个打开的孤立连接(它们最终会自己超时),但关闭它们始终是最好的做法 当ADODB使用远程连

在将rs.Close设置为nothing之前是否需要调用它


编辑:我们有一个全局连接,在应用程序期间保持打开状态,所有记录集对象都使用相同的连接。我在下面看到两个答案,它们谈到需要关闭记录集,以确保连接不会被挂断。对我来说,这听起来像是很多愚蠢的谈话,因为连接是由连接对象控制的,而不是记录集对象,对吗?但是如果我在这里遗漏了什么,请告诉我…

是的,这不仅仅是强制垃圾收集,它还告诉服务器连接正在终止,这避免了多个打开的孤立连接(它们最终会自己超时),但关闭它们始终是最好的做法


当ADODB使用远程连接而不是本地连接时,这一点尤为明显

显式调用
Close
的唯一原因是,当您不确定记录集是否从项目中的其他地方引用时,通常是由于一些粗心的编码

Dim rs as ADODB.Recordset
set rs = ReturnARecordset 'assume ReturnARecordset does just that...

'do something with rs

rs.Close
set rs = Nothing

最后一行应该在不显式调用
Close
的情况下终止记录集实例,除非
MyControl
保存了一个额外的引用,从而阻止了正常的删除。在
rs
上调用
Close
将确保
MyControl
无法将其引用用于任何有用的内容,同时会导致崩溃。

您可能会遇到ODBC或OLEDB池问题,这些问题会使连接保持打开并占用池插槽:

连接蠕变的常见原因包括:

ADO连接和记录集对象实际上并没有关闭。如果不显式关闭它们,它们将不会被释放到池中。这可能是连接蠕变最常见的一个原因

您创建的ADO对象(尤其是连接对象)未显式释放。显式地释放您创建的对象只是一种良好的编程实践。如果分配内存,请释放它。根据您使用的语言,让变量超出范围可能会导致释放变量,也可能不会导致释放变量


如果有可能涉及到.Net互操作,请小心:有很多关于COM对象(或包含的对象)在.Net的垃圾收集下释放的惰性方式所导致的问题的警告。

我需要编写许多文件。如果在写入每个文件后我没有关闭连接,那么在后续文件的末尾我会收到无关的垃圾

Dim rs as ADODB.Recordset
Set rs = ReturnARecordset
...
MyControl.ObscureMethod rs
...
Set rs = Nothing

fsT.Close

“刷新”输出流。因此,当我保存一个新文件时,它是“干净的”。

这毫无意义。Open将连接对象作为参数,关闭记录集不会关闭连接。我们的应用程序只有一个连接对象,它在应用程序运行期间保持打开状态,所有查询都使用这个对象。考虑到这一点,是否还有其他理由关闭记录集?我假设当记录集的引用计数达到0时,它将处理调用Close在其析构函数中所做的任何事情,但我不确定这就是我问的原因。也就是说,当记录集之后将立即设置为nothing(显式或超出范围)时,是否还有其他原因关闭记录集我的想法完全正确。我主要是想弄清楚是否有正当的理由对记录集变量调用Close方法,这些变量对于创建它们的函数来说是私有的,并且很快就会超出范围。调用
Close
,显式地将本地引用设置为
Nothing
,这是internet代码浴室充满的同一个Cargo Cult编程的一部分。根据常识,最好是在你们的特定环境中测试泄漏。是的,当我知道它将要超出范围时,我从不设置为“无”。但我不想听到关于将其设置为“无”的重要性的多个答案,而这不是我的问题所在,因此我在其中添加了一行内容以防止这些评论:)据我所知,当记录集没有使用自己的连接打开时,池不是一个问题。好的,这是有意义的。我只处理过传递了连接对象的记录集,老实说,我甚至不记得不这样做就可以打开它们。谢谢
fsT.Open