0

我实际上有这个小功能按预期工作:

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 而不是一个(也许是数组?),但我不知道该怎么做。

谢谢你。

4

2 回答 2

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

表格的表格将以类似的方式工作,因为您可以从表格中选择数据库(选择不同的)并循环通过该记录集附加表格以进一步选择(选择数据库...的表格)

于 2012-11-07T13:39:51.527 回答
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

这样您就可以避免重复(通常很耗时)连接到外部数据库

于 2012-11-07T13:40:24.367 回答