2012-03-15 54 views
0

方案:我有一个通过链接表管理器数据库工具相互链接的前端和后端Access 2007数据库。后端数据库将被移至服务器上的某个位置。每个设施的服务器名称会有所不同,现在大约有40个左右,这一年将会增加。如何利用C#中的Access 2007链接表管理器

我需要尝试完成的是以编程方式更改链接表。我需要将连接字符串建立喜欢的东西:

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

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

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

+0

见http://stackoverflow.com/questions/7461414/ado-net-way-for-creating-a-linked-table – Fionnuala 2012-03-15 17:42:18

+0

谢谢我认为这可能是我一直在寻找的。 – WillN 2012-03-15 18:06:13

+0

这就是我在寻找感谢链接Remou。 – WillN 2012-03-15 19:00:21

回答

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