为什么我不能直接使用CurrentDB()方法将表重新链接到vba?

时间:2011-04-15 11:20:59

标签: ms-access vba

有人可以解释为什么第一个代码示例有效但第二个代码没有?

这个重新链接代码可以工作:

Dim db As Database
Dim sNewLinkAddress As String

sNewLinkAddress = "C:\temp\backend.accdb"
Set db = CurrentDb

db.TableDefs("table1").Connect = ";Database=" & sNewLinkAddress
db.TableDefs("table1").RefreshLink

此重新链接代码不起作用,但未给出错误消息:

Dim sNewLinkAddress As String

sNewLinkAddress = "C:\temp\backend.accdb"

CurrentDb().TableDefs("table1").Connect = ";Database=" & sNewLinkAddress
CurrentDb().TableDefs("table1").RefreshLink

我担心的是,在使用CurrentDB()直接返回的Database对象和使用设置为CurrentDB()返回的Database对象的变量'db'之间,我没有意识到存在根本区别。在我看来,两种方式应该是相同的,但显然我错了!

过去我直接使用CurrentDB()来处理各种事情,比如打开一个没有问题的记录集。重新链接表似乎存在特定问题。对这里发生了什么的任何想法?

我正在使用Access 2007,但同样的问题也适用于2003.

1 个答案:

答案 0 :(得分:6)

每次调用CurrentDb()时,都会返回数据库对象的新实例

为了说明我的意思,我将使用字母来表示数据库实例(这些字母是任意的,只是为了让它更容易遵循逻辑)。

因此,在您的第一个示例中,您正在使用CurrentDb的返回值分配给数据库对象db。然后每次调用db时,都指的是同一个数据库对象实例:

Set db<A> = CurrentDb

db<A>.TableDefs("table1").Connect = ";Database=" & sNewLinkAddress
db<A>.TableDefs("table1").RefreshLink

在第二个示例中,您对CurrentDb函数进行多次调用,每次调用都会返回不同的数据库对象实例:

CurrentDb()<B>.TableDefs("table1").Connect = ";Database=" & sNewLinkAddress
CurrentDb()<C>.TableDefs("table1").RefreshLink

这里的结果是,当您在第二行上调用RefreshLink时,您正在对数据库对象的全新实例进行操作;即,其“table1”Connect属性尚未更改的一个。