从一个数据库链接多个表

时间:2012-11-07 13:33:31

标签: sql vba ms-access

我实际上这个小功能按照假设运行:

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而不是一个(可能是数组?),但我不知道如何做到这一点。

谢谢。

2 个答案:

答案 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

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