Как обновить связанные таблицы в Доступе mdb, когда ODBC изменяется

    <record id="kanabn_count_dashbord" model="kanban.count">
        <field name="name">Kanban Dashboard</field>
    </record>
11
задан BTB 19 February 2009 в 12:06
поделиться

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;"

Кроме того, взгляните на справку Доступа для TableDef.RefreshLink метод.

Версия кода 1

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

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

Одна последняя вещь: если Вы все еще получаете проблемы, которые требуют, чтобы Вы перезапустили Доступ для изменений, чтобы быть видимыми, затем взглянуть на мой код в Перезапуске и уплотнении базы данных программно по моему сайту.

Примечание: Версия кода 2 была вдохновлена частично этой статьей Access Web.

29
ответ дан 3 December 2019 в 02:11
поделиться

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

5
ответ дан 3 December 2019 в 02:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: