当基础SQL Server表的列发生更改时,更新Access Link Table

时间:2009-04-16 07:19:58

标签: sql-server vba ms-access access-vba

在工作中,我们有一个SQL Server数据库,有几个用户使用Access 2003连接到(只读)。

这很好,除了现在他们看到的其中一个表经常重新创建,这个过程的一部分涉及交叉表查询。

这意味着,根据数据,每次重新生成表时,列的数量和名称都可能会发生变化。

然而,当他们从Access查看重新创建的表时,它仍会显示表首次链接时的列标题。

有没有一种方法可以在每次打开Access数据库时以编程方式重新链接表?

3 个答案:

答案 0 :(得分:3)

我最终做的是创建一个类似于下面的VBA函数(需要错误处理!)

Public Function ReConnectToLinkTable()

Dim db As Dao.Database
Dim tdf As Dao.TableDef

Set db = CurrentDb
Set tdf = db.CreateTableDef("local_table_name")

tdf.Connect = "ODBC;DRIVER=SQL Server;SERVER=server_name;UID=user_name;" & _ 
              "PWD=password;APP=Microsoft Data Access Conponents;" & _
              "DATABASE=database_name"
tdf.Attributes = TableDefAttributeEnum.dbAttachSavePWD
tdf.SourceTableName = "server_table_name"    

db.TableDefs.Delete ("local_table_name")
db.TableDefs.Append tdf

End Function

然后我创建了一个名为AutoExec的宏(名称保证在打开Access文件时调用它),它有一个RunCode动作,它调用ReconnectToLinkTable()函数。

答案 1 :(得分:1)

当服务器上的表或视图发生更改时,ODBC链接表会中断。某些更改可能会导致它们变为只读,而其他更改则不会包含所有列。

我发现更新连接字符串无法成功解决此问题。它通常会修复缺少的字段,但它仍然是只读的。唯一可靠的方法是动态重新创建链接表。

另一种选择是根本不使用链接表,而是使用具有相应连接字符串的已保存QueryDef。这将永远不必更新,但可能是性能问题,因为存储在表链接中的元数据有助于Access了解如何检索数据。如果没有存储在表链接中的元数据,则每次运行查询时都必须从服务器检索该信息。

答案 2 :(得分:0)

通常使用this snippet之类的东西。在谷歌搜索“ms访问刷新链接表”,你会发现各种类似于这个的解决方案。