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

Posted

技术标签:

【中文标题】如何在 C# 中使用 Access 2007 链接表管理器【英文标题】:How do I utilize Access 2007 Linked Table Manager in C# 【发布时间】:2012-03-15 16:04:32 【问题描述】:

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

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

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

我发现 MSysObjects 中的数据库列包含需要更改的链接字符串。问题变成了,如何获得更改系统表的权限或使用一些 .dll 允许我更改指向新建字符串的链接?

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

【问题讨论】:

见***.com/questions/7461414/… 谢谢,我想这可能就是我想要的。 这就是我想要的,感谢 Remou 的链接。 @Fionnuala:问题实际上是不同的。那个是关于用 SQL 添加链接表的,这个是关于重新定位前端 Access 应用程序/数据库中已经存在的链接表的。前者做不到,后者可以…… 【参考方案1】:

您可以像这样以编程方式从 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

【讨论】:

以上是关于如何在 C# 中使用 Access 2007 链接表管理器的主要内容,如果未能解决你的问题,请参考以下文章

我无法使用 C# 语句更新 Access 2007 表

C# MD5 和/或其他加密 oledb (access 2007)

针对 Access 2007 进行编程?

access 2007 查询和 c# 数据表显示不同的输出

如何将 Visual Basic 6 组合框与 Microsoft Access 2007 表中的字段链接

如何在 MS Access 中使用 C# 获取所有表名和列名?