有人可以解释为什么第一个代码示例有效但第二个代码没有?
这个重新链接代码可以工作:
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.
答案 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属性尚未更改的一个。