Подтвердить что ты не робот

Как обновить связанные таблицы в Access mdb при изменении ODBC

Я могу создать Access mdb и добавить связанную таблицу в базу данных Sql Server через ODBC. Если я изменю сервер Sql, с которым ODBC подключается к аплету панели управления ODBC, mdb по-прежнему подключается к исходному серверу Sql до тех пор, пока не будет перезагружен Access.

Есть ли способ связать эти связанные таблицы серверов без перезапуска Access?

EDIT: Я хотел бы сделать это в коде

4b9b3361

Ответ 1

Вы можете использовать приведенный ниже код, чтобы обновить все таблицы 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 был частично вдохновлен этой статьей веб-сайта Access.

Ответ 2

Какую версию Access вы используете? В 2000 году вы можете перейти в "Инструменты" > "Утилиты баз данных" > "Связанный менеджер таблиц", чтобы изменить свои настройки.