Редактирование информации о связанных таблицах в Access 2003 - PullRequest
1 голос
/ 14 декабря 2010

У меня есть база данных Access 2003 со связанными таблицами с базой данных SQL Server 2005.Информация о пользователе (пароль), которая используется для создания соединения ODBC между Access и SQL Server, была недавно обновлена.

Когда я открываю базу данных Access и пытаюсь редактировать информацию о связанных таблицах, я могу открыть таблицы и посмотреть свои данные.Однако, когда я закрываю Access и снова открываю базу данных Access, кажется, что информация о пароле восстановлена, и я получаю ошибку соединения ODBC.

Кто-нибудь знает, что я делаю неправильно?

Как следствие, у нас есть около десятка баз данных Access с многочисленными связанными таблицами, которые нуждаются в этом обновлении.Это лучший способ обновить эту информацию?Связанные таблицы, кажется, были созданы с использованием разных компьютеров, так как идентификатор рабочей станции, указанный в соединении ODBC, отличается.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2010

Проблема с диспетчером связанных таблиц (LTM) заключается в том, что у вас есть связанные таблицы, которые на самом деле являются ссылками на представления SQL. В этом случае LTM будет перекомпоновывать «таблицы», не переназначая им надлежащие PK, и они станут не обновляемыми. Я написал некоторый код, который я использовал для запуска из VBE, это быстро и грязно, но вы, несомненно, можете адаптировать его, если вам это нужно. Есть 2 подпрограммы, одна для таблиц и одна для промежуточных запросов.

Option Compare Database
option explicit

Const kOld = "remote.g"  'string to identify old server
'new server odbc string
Const kConnLux = "ODBC;DRIVER=SQL Server Native Client 10.0;SERVER=xxxx;UID=yyyy;PWD=zzzz;"

Sub UpdateTables()
    Dim db As Database, td As TableDef
    Dim hasIndex As Boolean, strSql As String

    Set db = CurrentDb
    For Each td In db.TableDefs
        If InStr(1, td.Connect, kOld) > 0 Then  'lien vers CE serveur ?
            If td.Name Like "dbo_vw*" And td.Indexes.count = 1 Then 'table = vue attachee --> pbl de clef primaire
                strSql = "CREATE INDEX " & td.Indexes(0).Name & " ON [" & td.Name & "](" & td.Indexes(0).Fields & ")"
                ' convert field list from (+fld1;+fld2) to (fld1,fld2)
                strSql = Replace(strSql, "+", "")
                strSql = Replace(strSql, ";", ",")
                hasIndex = True
            Else
                hasIndex = False
            End If
            td.Connect = kConnLux
            td.RefreshLink
            Debug.Print td.Name
            If hasIndex And td.Indexes.count = 0 Then
                ' if index now removed then re-create it
                CurrentDb.Execute strSql
            End If
        End If
    Next td
    Debug.Print "Done"
End Sub

Sub UpdateQueries()
    Dim db As Database
    Dim td As QueryDef
    Set db = CurrentDb
    For Each td In db.QueryDefs
        If InStr(1, td.Connect, kOld) > 0 Then
            td.Connect = kConnLux
            Debug.Print td.Name, td.Connect
        End If
    Next td
End Sub
0 голосов
/ 17 декабря 2010

Напишите процедуру, которая обновляет Свойство Connect из TableDef и сохраняет изменение с RefreshLink.

...