2011-12-05 57 views
9
Dim rs as ADODB.Recordset 
set rs = ReturnARecordset 'assume ReturnARecordset does just that... 

'do something with rs 

rs.Close 
set rs = Nothing 

是否有必要在设置之前调用rs.Close?在将它设置为空白之前,是否需要关闭Adodb.recordset对象?

编辑:我们有一个全局连接,我们在应用程序期间保持打开状态,并且所有记录集对象都使用同一个连接。我在下面看到两个答案,谈到需要关闭记录集以确保连接不会悬空。对我来说,听起来像很多傻话,因为连接是由连接对象控制的,而不是记录集对象?但请让我知道,如果我在这里丢失的东西...

回答

4

显式调用Close的唯一原因是当您不确定记录集是否从项目中的其他位置引用时,通常是由于某些草率编码造成的。

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

最后一行应该终止记录实例,而不调用Close明确,除非MyControl拿着一个额外的参考,从而防止正常拆除。致电Closers将确保MyControl不能使用其参考的任何有用的东西,同时在火焰中崩溃。

+0

我的想法正好。我主要试图找出是否有一个合理的理由来调用记录集变量的Close方法,这些记录集变量对于它们创建的函数是私有的,并且很快超出范围。 –

+2

调用'Close',明确设置* Local *参考到'Nothing'是代码的互联网浴室充满的同一个Cargo Cult编程的一部分。使用常识,最好的办法是测试特定环境下的泄漏。 – wqw

+0

是的,当我知道它即将超出范围时,我从未设置过任何东西。但我不希望听到多个答案,将其设置为无关的重要性时,这不是我的问题是关于所以我把行在那里,以防止这些意见:) –

4

是的,这不仅仅是强制垃圾收集它也告诉服务器连接正在终止,这避免了多个开放的孤立连接(他们最终会自行超时),但总是将其关闭。

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

+1

这没有意义。 Recordset.Open将连接对象作为参数,关闭记录集不会关闭连接。我们的应用程序有一个连接对象,在应用程序持续时间内保持打开状态,所有查询都使用此对象。所以考虑到这一点,是否有其他理由关闭记录集?我会假设,当记录集的引用计数达到0时,它将负责调用Close在析构函数中执行的任何操作,但我不确定这是为什么我要问。 –

+0

也就是说,是否有任何其他理由关闭记录集时,它将立即被设置为无(明确或超出范围) –

1

您可以运行到ODBC或OLEDB池的问题,它保持连接打开并占用一池槽:连接蠕变

常见的原因包括:

ADO连接和Recordset对象没有真正关闭。如果你没有明确地关闭它们,它们将不会被释放到池中。这可能是连接蠕变的最常见原因。

您创建的ADO对象(特别是Connection对象)没有明确释放。显式释放你创建的对象只是很好的编程习惯。如果你分配内存,释放它。根据您使用的语言,让变量超出范围可能会导致它被释放。

Pooling in the Microsoft Data Access Components

,如果有涉及.NET互操作程序的任何机会警惕:有很多关于因偷懒的办法COM对象(或包含的对象)下发生的释放引起的问题的警告。 Net的垃圾收集。

+0

请参阅我的编辑并让我知道如果我在这里丢失了一些东西...... –

+1

就我所知,当一个Recordset没有用自己的Connection打开时,池并不是一个问题。 – Bob77

+0

好吧,这是有道理的。我只是一直在处理已经传递连接对象的记录集,并且实际上甚至都没有记住你可以打开它们而没有这样做。谢谢。 –

相关问题