Как обновить связанные таблицы в Access MDB при изменении ODBC - PullRequest
11 голосов
/ 19 февраля 2009

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

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

РЕДАКТИРОВАТЬ: Я хотел бы сделать это в коде

Ответы [ 2 ]

29 голосов
/ 19 февраля 2009

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

5 голосов
/ 19 февраля 2009

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

...