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

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

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

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


person BTB    schedule 19.02.2009    source источник


Ответы (2)


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

person Renaud Bompuis    schedule 19.02.2009
comment
Было бы неплохо исключить системные таблицы, то есть таблицы, запускающие MSys. - person Fionnuala; 19.02.2009
comment
Хорошо, но зачем им строка подключения, начинающаяся с ODBC? Они ни в коем случае не сравнятся с этим. - person Renaud Bompuis; 19.02.2009
comment
Кажется, это работает для меня, но только если я изменю строку подключения. Если я изменю, скажем, сервер в ODBC, то связанная таблица по-прежнему будет подключаться к исходному серверу после вызова RefreshODBCLinks. Если я изменю имя базы данных в строке подключения, связанный сервер обновится. - person BTB; 19.02.2009
comment
Хорошо, попробуйте вторую версию или просто воспользуйтесь моей функцией перезапуска, если этого достаточно для принудительного обновления Access. - person Renaud Bompuis; 19.02.2009
comment
Эти решения не обрабатывают прикрепленные представления: представление SQL Server, прикрепленное в виде таблицы в Access, нуждается в локальном индексе, чтобы его можно было обновлять. - person Patrick Honorez; 06.09.2011
comment
Хотите знать, почему вы соответствуете ODBC; а не (tbl.Attributes And dbAttachedODBC) ›0 ... - person Graham Charles; 10.02.2012
comment
@GrahamCharles, это тоже подойдет. Думаю, я использовал совпадение строк, потому что этот код был извлечен из версии, которая делала больше, чем требовалось для ответа на вопрос. - person Renaud Bompuis; 11.02.2012
comment
Спасибо за эту замечательную функцию, работает как шарм. Я написал свой собственный, но он просто изменял свойство Connect и не позволял изменять атрибут dbAttachSavePWD. Я бы просто добавил один необязательный аргумент, sFilter, чтобы игнорировать таблицы, не соответствующие строке поиска. Это позволяет использовать функцию для выборочного обновления таблиц, когда у вас есть ссылки на разные базы данных. - person Patrick Honorez; 13.08.2014
comment
Если таблицы связаны с представлениями SQL Server, версия кода 2 должна быть отредактирована для воссоздания PK, в противном случае данные будут R-O. - person Patrick Honorez; 31.07.2015
comment
Я слишком долго ждал, чтобы отредактировать свой комментарий выше, но процедуру для воссоздания индексов можно найти здесь: accessmvp.com/djsteele/DSNLessLinks.html - person Patrick Honorez; 31.07.2015
comment
Я не использовал ваш код, но создал свой собственный. Одна вещь, которую я хочу отметить, - это ограничение на 64 символа для имен таблиц в Access. Очевидное решение - усечь имя таблицы до 64 символов, но оставить аргумент SourceName в качестве исходного (более 64 символов) имени таблицы. Ссылка работает нормально с первого раза. Однако, и я думаю, что это недосмотр / ошибка в доступе, при обновлении таблицы с помощью TableDef.RefreshLink SourceName также усекается до 64 символов и выдается ошибка! РАЗДРАЖАЮЩИЙ! - person blobbles; 17.02.2016

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

person Dinci Garrone    schedule 19.02.2009
comment
Спасибо - вы правы, это работает, если я использую диспетчер связанных таблиц и устанавливаю флажок Всегда запрашивать новое местоположение, а затем снова выбираю ODBC. Я бы хотел заново связать таблицу в коде - я отредактирую свой вопрос, чтобы прояснить это. - person BTB; 19.02.2009
comment
Почему вы хотите заново связать свой стол? Что от этого вы получите? - person Brettski; 24.02.2009
comment
ODBC изменяется так, чтобы указывать на другой сервер / базу данных, но приложение Access не знает об изменении до его перезапуска. - person BTB; 24.02.2009