Как использовать Access 2007 Linked Table Manager в C # - PullRequest
0 голосов
/ 15 марта 2012

Сценарий. У меня есть база данных Front End и Back End Access 2007, которые в настоящее время связаны друг с другом с помощью инструмента базы данных Linked Table Manager.Внутренняя БД будет перемещена в местоположение на сервере.Имя сервера будет отличаться для каждого объекта, и сейчас их около 40, которые будут увеличиваться в течение года.

Что мне нужно сделать, так это программно изменить связанные таблицы.Мне нужно будет построить связанную строку примерно так:

\\something\facilitynum(gathered from Environment variable)\c$\somefolder\.  

Я обнаружил, что столбец Database в MSysObjects содержит строку ссылки, которую необходимо изменить.Возникает вопрос: как получить разрешения на изменение системной таблицы или использовать некоторые .dll, которые позволят мне изменить ссылку на вновь созданную строку?

Все, что я нашел до сих пор, всегда приводит к ручному изменению ссылки в базе данных Access.

1 Ответ

0 голосов
/ 13 апреля 2015

Вы можете программно изменить ссылку изнутри Access (используя VBA), например, так (для этого используется файл dsn, содержащий фактическую информацию о сервере)

Private Sub UpdateDSN()
  On Error GoTo ErrorHandler

  Dim dbPath As String

  Dim connStr As String
  Dim Tdf As TableDef

  dbPath = Application.CodeDb.Name
  dbPath = Left(dbPath, InStr(dbPath, Dir(dbPath)) - 1)

  For Each Tdf In CurrentDb.TableDefs
    connStr = Tdf.Connect
    If InStr(1, UCase(connStr), "ODBC") Then
      connStr = "odbc; FILEDSN=" & dbPath & "db.dsn;"
      Tdf.Connect = connStr
      Tdf.RefreshLink
    End If
  Next

  Dim fName As String
  Dim fNumber As Integer
  Dim InputStr As String

  fNumber = FreeFile()
  fName = dbPath & "db.dsn"

  Dim serverName As String

  Open fName For Input As fNumber

  Do While Not EOF(fNumber)
    Line Input #fNumber, InputStr
    If InStr(1, UCase(InputStr), "SERVER=") > 0 Then
      serverName = Right(InputStr, Len(InputStr) - _
                   (InStr(1, InputStr, "SERVER=") + 6))
    End If
  Loop

  ErrorHandler:
  On Error GoTo 0

  DoCmd.OpenForm "Main"

  cap = Forms!main.Caption
  If InStr(1, cap, "(") > 1 Then
     cap = Left(cap, InStr(1, cap, "("))
  End If
  Forms!main.Caption = "db" & " (" & serverName & ")"
End Sub
...