Sie können den folgenden Code verwenden, um alle ODBC-Tabellen in Ihrem Access-Projekt auf einen bestimmten DSN zu aktualisieren.
Wie man es verwendet
einfach den Code kopieren in einem neuen oder vorhandenen VBA-Modul und, wo Sie die Links aktualisieren möchten, rufen Sie es mit der richtigen DSN für die neue ODBC-Verbindung:
RefreshODBCLinks "ODBC;DRIVER=SQL Server Native Client 10.0;" & _"
"SERVER=SQLSERVER;UID=Administrator;" & _
"Trusted_Connection=Yes;" & _
"APP=2007 Microsoft Office system;DATABASE=OrderSystem;"
Schauen Sie sich auch die Access-Hilfe für die TableDef.RefreshLink
Methode an.
-Code-Version 1
klassischer Art und Weise von dem Linken aber Zugriff kann Verbindungsinformationen im Speicher halten, wenn die Tabellen vor RefreshODBCLinks
genannt wird verwendet wurden.
Public Sub RefreshODBCLinks(newConnectionString As String)
Dim db As DAO.Database
Dim tb As DAO.TableDef
Set db = CurrentDb
For Each tb In db.TableDefs
If Left(tb.Connect, 4) = "ODBC" Then
tb.Connect = newConnectionString
tb.RefreshLink
Debug.Print "Refreshed ODBC table " & tb.Name
End If
Next tb
Set db = Nothing
End Sub
-Code-Version 2
Dies wird komplett neu erstellen, um die ODBC-verknüpfte Tabellen: die alten, dann neue Tabellen des angegebenen DSN umbenannt werden verwendet, werden die alte verknüpfte Version vor dem Löschen erstellt werden .
Bitte stellen Sie sicher, dass Sie dies testen und eventuell Code hinzufügen, um Fehler besser zu behandeln.
Beachten Sie auch, dass der Parameter dbAttachSavePWD
, der während der Erstellung der ODBC-Tabelle übergeben wurde, das ODBC-Kennwort (falls vorhanden) in Access speichert. Entfernen Sie es einfach, wenn Sie das nicht brauchen.
Public Sub RefreshODBCLinks(newConnectionString As String)
Dim db As DAO.Database
Dim tb As DAO.TableDef
Dim originalname As String
Dim tempname As String
Dim sourcename As String
Dim i As Integer
Set db = CurrentDb
' Get a list of all ODBC tables '
Dim tables As New Collection
For Each tb In db.TableDefs
If (Left(tb.Connect, 4) = "ODBC") Then
tables.Add Item:=tb.Name, key:=tb.Name
End If
Next tb
' Create new tables using the given DSN after moving the old ones '
For i = tables.count To 1 Step -1
originalname = tables(i)
tempname = "~" & originalname & "~"
sourcename = db.TableDefs(originalname).SourceTableName
' Create the replacement table '
db.TableDefs(originalname).Name = tempname
Set tb = db.CreateTableDef(originalname, dbAttachSavePWD, _
sourcename, newConnectionString)
db.TableDefs.Append tb
db.TableDefs.Refresh
' delete the old table '
DoCmd.DeleteObject acTable, tempname
db.TableDefs.Refresh
tables.Remove originalname
Debug.Print "Refreshed ODBC table " & originalname
Next i
Set db = Nothing
End Sub
Eine letzte Sache: Wenn Sie immer noch Probleme bekommen, die erfordern, dass Sie Access für die Änderungen neu starten, einen Blick auf meinen Code in Restarting and compacting the database programmatically auf meiner Seite sichtbar sein, dann haben.
Hinweis: Code Version 2 wurde teilweise von this Access Web article inspiriert.
Es wäre eine sehr gute Idee, Systemtabellen auszuschließen, dh Tabellen, die „MSys“ – Fionnuala
OK, aber warum sollten sie eine Verbindungszeichenfolge, beginnend mit „ODBC“ beginnen? Sie würden auf jeden Fall nicht übereinstimmen. –
Es scheint für mich zu funktionieren, aber nur wenn ich die Verbindungszeichenfolge ändere. Wenn ich den Server in ODBC ändere, verbindet sich die Linked-Tabelle immer noch mit dem ursprünglichen Server, nachdem ich RefreshODBCLinks aufgerufen habe. Wenn ich den Datenbanknamen in der Verbindungszeichenfolge ändere, wird der Verbindungsserver aktualisiert. – BTB