ODBC更改时如何刷新Access mdb中的链接表

BTB*_*BTB 11 ms-access odbc

我可以创建一个Access mdb并通过ODBC将链接表添加到Sql Server数据库.如果我使用ODBC控制面板小程序更改ODBC连接的Sql Server,则mdb仍会连接到原始Sql Server,直到重新启动Access.

有没有办法重新链接这些链接的服务器表而不重新启动Access?

编辑:我想在代码中这样做

Ren*_*uis 29

您可以使用下面的代码将Access项目中的所有ODBC表刷新到给定的DSN.

如何使用它

只需将代码复制到新的或现有的VBA模块中,并在要刷新链接的位置,使用适当的DSN为新的ODBC连接调用它:

RefreshODBCLinks "ODBC;DRIVER=SQL Server Native Client 10.0;" & _"
                 "SERVER=SQLSERVER;UID=Administrator;" & _
                 "Trusted_Connection=Yes;" & _
                 "APP=2007 Microsoft Office system;DATABASE=OrderSystem;"
Run Code Online (Sandbox Code Playgroud)

另外,请查看该TableDef.RefreshLink方法的Access帮助.

代码版本1

重新链接的经典方式,但如果在RefreshODBCLinks调用之前已使用过表,则Access可能会将连接信息保留在内存中.

Public Sub RefreshODBCLinks(newConnectionString As String)
    Dim db As DAO.Database
    Dim tb As DAO.TableDef
    Set db = CurrentDb
    For Each tb In db.TableDefs
        If Left(tb.Connect, 4) = "ODBC" Then
            tb.Connect = newConnectionString
            tb.RefreshLink
            Debug.Print "Refreshed ODBC table " & tb.Name
        End If
    Next tb
    Set db = Nothing
End Sub
Run Code Online (Sandbox Code Playgroud)

代码版本2

这将完全重新创建ODBC链接表:将重命名旧表,然后在删除旧链接版本之前创建使用给定DSN的新表.
请确保您测试这个并且可能添加一些代码以便在必要时更好地处理错误.

另请注意,dbAttachSavePWD在创建ODBC表期间传递的参数将在Access中保存ODBC密码(如果有).如果那不是您需要的,请将其删除.

Public Sub RefreshODBCLinks(newConnectionString As String)
    Dim db As DAO.Database
    Dim tb As DAO.TableDef
    Dim originalname As String
    Dim tempname As String
    Dim sourcename As String
    Dim i As Integer

    Set db = CurrentDb
    ' Get a list of all ODBC tables '
    Dim tables As New Collection
    For Each tb In db.TableDefs
        If (Left(tb.Connect, 4) = "ODBC") Then
            tables.Add Item:=tb.Name, key:=tb.Name
        End If
    Next tb

    ' Create new tables using the given DSN after moving the old ones '
    For i = tables.count To 1 Step -1
            originalname = tables(i)
            tempname = "~" & originalname & "~"
            sourcename = db.TableDefs(originalname).SourceTableName
            ' Create the replacement table '
            db.TableDefs(originalname).Name = tempname
            Set tb = db.CreateTableDef(originalname, dbAttachSavePWD, _
                                        sourcename, newConnectionString)
            db.TableDefs.Append tb
            db.TableDefs.Refresh
            ' delete the old table '
            DoCmd.DeleteObject acTable, tempname
            db.TableDefs.Refresh
            tables.Remove originalname
            Debug.Print "Refreshed ODBC table " & originalname
    Next i
    Set db = Nothing
End Sub
Run Code Online (Sandbox Code Playgroud)

最后一件事:如果您仍然遇到需要重新启动Access才能看到更改的问题,那么请查看我的代码,重新启动并在我的网站上以编程方式压缩数据库.

注意:代码版本2的部分灵感来自此Access Web文章.


小智 5

您使用的是什么版本的Access?在2000年,您可以转到工具>数据库实用程序>链接表管理器来更改您的设置.