Вы можете использовать приведенный ниже код для обновления всех таблиц ODBC в вашем проекте Access до заданного 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;"
Кроме того, посмотрите справку Access для метода TableDef.RefreshLink
.
Кодовая версия 1
Классический способ повторного связывания, но Access может хранить информацию о соединении в памяти, если таблицы использовались до вызова 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 (если есть) в Access. Просто удалите его, если это не то, что вам нужно.
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, чтобы изменения были видны, взгляните на мой код в Перезапуск и сжатие базы данных программным путем на моем сайте.
Примечание. Кодовая версия 2 частично основана на этой статье о доступе в Интернете .