如何在C#中使用Access 2007链接表管理器

时间:2012-03-15 16:04:32

标签: ms-access ms-access-2007

场景:我有一个前端和后端Access 2007数据库,它们当前通过链接表管理器数据库工具相互链接。后端数据库将被移动到服务器上的某个位置。每个设施的服务器名称都不同,现在大约有40个左右,全年都会增加。

我需要尝试完成的是以编程方式更改链接表。我需要将链接字符串构建为:

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

我发现MSysObjects中的Database列包含需要更改的链接字符串。问题是,如何获得更改System表或使用某些.dll的权限,这将允许我更改新构建的字符串的链接?

到目前为止,我发现的所有内容总是会导致手动更改Access数据库中的链接。

1 个答案:

答案 0 :(得分:0)

您可以通过编程方式更改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