Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 我可以在不同的表上使用相同的记录集变量吗?_Ms Access_Recordset_Multiple Tables - Fatal编程技术网

Ms access 我可以在不同的表上使用相同的记录集变量吗?

Ms access 我可以在不同的表上使用相同的记录集变量吗?,ms-access,recordset,multiple-tables,Ms Access,Recordset,Multiple Tables,我是Microsoft Access的新手 如何在不同的表上使用相同的记录集变量?是的,但在将记录集变量重新分配给另一个记录集之前,必须确保关闭该记录集。以下是一个例子: Dim rs As DAO.Recordset Dim bTimeToChangeRecordsets As Boolean Set rs = CurrentDb.OpenRecordset("Contacts") 'add business logic here' If bTimeToChangeRecordsets

我是Microsoft Access的新手


如何在不同的表上使用相同的记录集变量?

是的,但在将记录集变量重新分配给另一个记录集之前,必须确保关闭该记录集。以下是一个例子:

Dim rs As DAO.Recordset
Dim bTimeToChangeRecordsets As Boolean

Set rs = CurrentDb.OpenRecordset("Contacts")

'add business logic here'

If bTimeToChangeRecordsets Then
    rs.Close
    'setting to Nothing is not necessary here,'
    'because setting to a new recordset instance has the '
    'same effect on the variable reference count '
    Set rs = CurrentDb.OpenRecordset("Comments")
End If

'more business logic'

rs.Close
Set rs = Nothing
关于这个问题的许多评论都集中在需要将记录集变量设置为
Nothing
,是否需要以及何时需要,以及是否需要在释放记录集引用之前调用记录集关闭。关于这个主题,有一些非常好的评论,围绕堆栈溢出的许多问题展开;与你的情况特别相关。我也会告诉你去和


冒着过于简单化的风险,我可以这样总结这个问题:如果访问引用计数工作正常,就不必担心通过将引用设置为
Nothing
来显式释放引用,也不必显式关闭记录集。然而,实践经验告诉我们,考虑到访问行为,这两种习惯都应该成为VBA最佳实践编码的一部分

可以,只要不希望变量指向两个记录集

然而问题是,你为什么要这样做?你希望保存什么?资源?没什么大不了的。代码可读性也会受到影响。如果一周后您或其他人正在查看您的代码,他们可能不知道发生了什么。因此,我建议每个表/查询使用一个记录集变量

还有变量的作用域。如果在子例程/函数中定义,则它仅在该子例程/函数中可见。如果位于顶部,则该表单/报表/模块中的所有sou/职能部门都可以看到它。如果您在模块中声明它是全局的,那么它将随处可见


所以问题是你为什么要问?

我不知道你在问什么。给我们一个你想做什么的例子。我猜你在写VBA脚本程序。我要尝试的是,在处理完第一个表后,将用于记录集的“object”变量设置为Null。它有望释放与该对象关联的任何已分配资源,然后您可以重新初始化它,以保存与同一个表或不同表关联的另一个查询的结果。不要将其设置为NULL。把它设为零。我同意将变量设置为Nothing是正确的,NULL是错误的。但是,将变量设置为新对象值对基础引用的影响与将变量设置为“无”对基础引用的影响相同。实际上,不,在重用变量之前,您不需要关闭该变量。如果将记录集保持打开状态,将无法关闭它,因为引用已丢失。这是不好的。事实上,即使不关闭记录集,也应该通过垃圾收集(最终)来清理它。但是,好的做法是在转到另一个表/查询之前关闭它。这将让它更快地发生。这就是为什么我在90年代没有明确关闭记录集的旧的邋遢DBs没有突然停止的原因。CosdeSlave,是的,我同意你应该在处理完记录集后关闭它们。但是我们讨论的是重用一个记录集变量而不关闭它。托尼,你似乎把事情搞混了。需要关闭记录集,否则可能会发生内存泄漏。从理论上讲,垃圾收集应该释放内存,但我们都很清楚VBA的引用计数是不完善的,并且在应该清理时不能可靠地清理。将变量设置为Nothing是一个完全不同的步骤——操作的不是内存结构本身,而是指向它的指针。您正在将指针设置回零。当重新使用它时,您不需要这样做,因为您正在将它设置为指向不同的内存结构。我可以看到,如果您必须通过许多相同的表循环并执行相同的操作,则可以重新使用记录集变量。但话说回来,如果它们是相同的,为什么它们是分开的。我不同意为新对象重用变量是绝对不好的做法。CodeSlave的例子是相关的。Paul,在CodeSlave的具体例子中是肯定的。但总的来说,我想说的是,你不应该在同一个子例程/函数中为两个不同的东西重用同一个变量,因为这在代码中会引起混淆。Tony,你本质上是说对象赋值是一种糟糕的做法,除了在初始化之后或作为初始化的一部分。这是一个非常广泛的概括,我无法想象它是一个有用的指南。我同意你的批评的肯定形式:如果它能增加清晰度,请毫不犹豫地定义一个新的对象变量。保罗,我不知道你在我的帖子的前两句中读到了什么。