Możesz użyć poniższego kodu, aby odświeżyć wszystkie tabele ODBC w projekcie programu Access do danej nazwy DSN.
Jak korzystać
Wystarczy skopiować kod do nowego lub istniejącego modułu VBA i, gdzie chcesz, aby odświeżyć linki, nazywają go z właściwego DSN dla nowego połączenia ODBC:
RefreshODBCLinks "ODBC;DRIVER=SQL Server Native Client 10.0;" & _"
"SERVER=SQLSERVER;UID=Administrator;" & _
"Trusted_Connection=Yes;" & _
"APP=2007 Microsoft Office system;DATABASE=OrderSystem;"
Zobacz także pomoc dostępu do metody TableDef.RefreshLink
.
Kod wersja 1
klasyczny sposób relinkowania ale dostęp do informacji o połączeniach można zachować w pamięci, jeśli stoły były używane przed RefreshODBCLinks
nazywa.
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
wersja kodu 2
To będzie całkowicie ponownie utworzyć tabele połączone ODBC: stare nich zostanie zmieniona, wówczas nowe tabele przy użyciu danego DSN zostanie utworzony przed usunięciem starej wersji połączonej .
Upewnij się, że to przetestujesz i możesz dodać kod, aby lepiej radzić sobie z błędami, jeśli to konieczne.
Należy również zauważyć, że parametr dbAttachSavePWD
przekazany podczas tworzenia tabeli ODBC zapisze hasło ODBC (jeśli istnieje) w programie Access. Po prostu go usuń, jeśli nie tego potrzebujesz.
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
Ostatnia sprawa: jeśli wciąż się problemy, które wymagają ponownego uruchomienia dostępu, aby zmiany były widoczne, a następnie spojrzeć na mojego kodu w Restarting and compacting the database programmatically na moim miejscu.
Uwaga: Kod wersji 2 został zainspirowany częściowo z wersji this Access Web article.
Byłoby bardzo dobrym pomysłem, aby wykluczyć tabele systemowe, czyli tabele rozpoczynające "MSys" – Fionnuala
OK, ale dlaczego miałyby ciąg połączenia zaczynający się od "ODBC"? W żadnym wypadku nie pasują do tego. –
Wygląda na to, że działa dla mnie, ale tylko wtedy, gdy zmienię ciąg połączenia. Jeśli zmienię, powiedz serwer w ODBC, to tabela Linked nadal łączy się z oryginalnym serwerem po wywołaniu RefreshODBCLinks. Jeśli zmienię nazwę bazy danych w ciągu połączenia, serwer połączony zostanie odświeżony. – BTB