Vous pouvez utiliser le code ci-dessous pour actualiser toutes les tables ODBC de votre projet Access vers un DSN donné.
Comment utiliser
Il suffit de copier le code dans un nouveau ou existant module VBA et où vous souhaitez actualiser les liens, appelez avec le DSN approprié pour la nouvelle connexion ODBC:
RefreshODBCLinks "ODBC;DRIVER=SQL Server Native Client 10.0;" & _"
"SERVER=SQLSERVER;UID=Administrator;" & _
"Trusted_Connection=Yes;" & _
"APP=2007 Microsoft Office system;DATABASE=OrderSystem;"
En outre, jetez un oeil à l'aide d'accès pour la méthode TableDef.RefreshLink
.
Code de la version 1
façon classique de re-lier, mais l'accès peut conserver les informations de connexion en mémoire si les tables ont été utilisées avant RefreshODBCLinks
est appelé.
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
version Code 2
Cela va complètement recréer les tables liées ODBC: les anciens seront renommés, de nouvelles tables en utilisant le DSN donné seront créés avant de supprimer l'ancienne version liée .
Veuillez vous assurer de tester ceci et peut-être ajouter du code pour mieux gérer les erreurs si nécessaire.
Notez également que le paramètre dbAttachSavePWD
transmis lors de la création de la table ODBC enregistrera le mot de passe ODBC (le cas échéant) dans Access. Retirez-le si ce n'est pas ce dont vous avez besoin.
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
Une dernière chose: si vous obtenez toujours des problèmes qui requièrent que vous redémarrez l'accès pour que les modifications soient visibles, alors jetez un oeil à mon code dans Restarting and compacting the database programmatically sur mon site.
Remarque: Le code version 2 s'inspire en partie de this Access Web article.
Ce serait une très bonne idée d'exclure les tables système, c'est-à-dire les tables qui démarrent "MSys" – Fionnuala
OK, mais pourquoi auraient-elles une chaîne de connexion commençant par "ODBC"? Ils ne correspondent pas dans tous les cas. –
Il semble fonctionner pour moi mais seulement si je change la chaîne de connexion. Si je change dire le serveur dans l'ODBC alors la table liée se connecte toujours au serveur d'origine après que j'appelle RefreshODBCLinks. Si je change le nom de la base de données dans la chaîne de connexion, le serveur lié est actualisé. – BTB