我可以创建Access mdb并通过ODBC将链接表添加到Sql Server数据库。如果我使用ODBC控制面板小程序更改ODBC连接的Sql Server,则mdb仍会连接到原始Sql Server,直到重新启动Access。
有没有办法重新链接这些链接的服务器表而无需重新启动Access?
编辑:我想在代码中执行此操作
答案 0 :(得分: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;"
另外,请查看TableDef.RefreshLink
方法的访问帮助。
代码版本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
代码版本2
这将完全重新创建ODBC链接表:将重命名旧表,然后在删除旧链接版本之前创建使用给定DSN的新表。
请确保您对此进行测试,并可能添加一些代码以便在必要时更好地处理错误。
另请注意,在创建ODBC表期间传递的参数dbAttachSavePWD
将在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
最后一件事:如果您仍然遇到需要重新启动Access以使更改可见的问题,请查看我网站上Restarting and compacting the database programmatically中的代码。
注意:代码版本2的灵感部分来自this Access Web article。
答案 1 :(得分:5)
您使用的是什么版本的Access?在2000年,您可以转到工具>数据库实用程序>链接表管理器来更改您的设置。