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

问题描述:

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

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

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

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

如何使用它

只需将代码复制一个新的或现有的VBA模块中,要刷新的联系,与新ODBC连接正确的DSN称之为:

RefreshODBCLinks "ODBC;DRIVER=SQL Server Native Client 10.0;" & _" 
       "SERVER=SQLSERVER;UID=Administrator;" & _ 
       "Trusted_Connection=Yes;" & _ 
       "APP=2007 Microsoft Office system;DATABASE=OrderSystem;" 

而且,看看在TableDef.RefreshLink方法的访问帮助。

代码版本1重新链接,但访问可以保持连接信息在内存中,如果已使用的表RefreshODBCLinks调用之前的

经典方式。

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 

代码版本2

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

还要注意参数dbAttachSavePWD创建ODBC表将保存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 

最后一两件事:如果你仍然收到这个要求重新启动,以使更改是可见的访问问题,然后看看我的代码在Restarting and compacting the database programmatically我的网站上。

注:代码版本2的一部分是从this Access Web article启发。

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

+0

感谢 - 你是对的它工作,如果我使用链接表管理器,并选中“始终提示输入新位置”,然后再次选择ODBC。我想用代码重新链接表格 - 我将编辑我的问题以清楚地说明问题。 – BTB 2009-02-19 11:59:59

+0

为什么你想重新连接你的桌子?这样做会得到什么? – Brettski 2009-02-24 04:56:30