我实际上这个小功能按照假设运行:
Function createAttached(strTable As String, strPath As String, strBaseTable As String) As Boolean
On Error GoTo CreateAttachedError
Dim tdf As TableDef
Dim strConnect As String
Dim fRetval As Boolean
Dim myDB As Database
DoCmd.SetWarnings False
Set myDB = CurrentDb
Set tdf = myDB.CreateTableDef(strTable)
With tdf
.Connect = ";DATABASE=" & strPath
.SourceTableName = strBaseTable
End With
myDB.TableDefs.Append tdf
myDB.TableDefs.Refresh
fRetval = True
DoCmd.SetWarnings True
CreateAttachedExit:
createAttached = fRetval
Exit Function
CreateAttachedError:
If Err = 3110 Then
Resume CreateAttachedExit
Else
If Err = 3011 Then
Resume Next
Else
If Err = 3012 Then
Set tdf = myDB.TableDefs(strTable)
tdf.Connect = ";DATABASE=" & strPath
tdf.RefreshLink
fRetval = True
GoTo CreateAttachedExit
End If
End If
End If
End Function
这段代码工作正常,我可以多次调用该函数,因为我想从另一个数据库添加表的链接。但是,我有大约30个表从同一个数据库导入,每次调用它时,这个脚本都会从头开始重新启动。由于数据库位于另一台服务器上,因此链接30个表大约需要1分钟。
当我需要从同一个数据库链接多个表时,我能用该功能做些什么来使它更快地工作?我希望它在参数中使用多个strTable和strBaseTable而不是一个(可能是数组?),但我不知道如何做到这一点。
谢谢。
答案 0 :(得分:1)
您可以遍历外部数据库中的tabledefs集合,也可以使用列表来列出要连接的所有表和外部数据库。
Dim db As Database
Dim ThisDb As Database
Set ThisDb = CurrentDB
sDb = "z:\docs\test.accdb"
Set db = OpenDatabase(sDb)
For Each tdf In db.TableDefs
''Connect
If Left(tdf.Name, 4) <> "MSys" Then
If IsNull(DlookUp("Name","MsysObjects","Type In (1,4,5,6) And Name='" _
& tdf.Name & "'")) Then
DoCmd.TransferDatabase acLink, "Microsoft Access", _
sDb, acTable, tdf.Name, tdf.Name
Else
If ThisDb.TableDefs(tdf.Name).connect <> vbNullString Then
ThisDb.TableDefs(tdf.Name).connect = ";DATABASE=" & sDb
ThisDb.TableDefs(tdf.Name).RefreshLink
End If
End If
End If
Next
表的表格将以类似的方式工作,您可以从表中选择数据库(选择不同)并循环通过该表记录集将表附加到另一个选择中(选择数据库所在的表...)
答案 1 :(得分:0)
您还可以做的是在不同的子设备中建立数据库连接以及数据库断开连接(我可能在这里缺少?)。
那么通常调用此脚本的代码(我假设你有一个循环)将如下所示:
call function/sub that opens the connection to DATABASE= strPath
your loop that calls Function createAttached
call function/sub that closes the connection to DATABASE= strPath
这样可以避免与外部数据库重复(通常很耗时)的连接