2009-02-19 4 views
11

Je peux créer une Access mdb et ajouter une table liée à une base de données Sql Server via ODBC. Si je change le serveur Sql auquel l'ODBC se connecte avec l'applet du panneau de configuration ODBC, mdb se connecte toujours au serveur Sql d'origine jusqu'à ce que l'accès soit redémarré.Comment actualiser les tables liées dans un mdb Access lorsque ODBC change

Est-il possible de relier ces tables de serveurs liés sans redémarrer Access?

EDIT: Je voudrais faire dans le code

Répondre

29

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.

+1

Ce serait une très bonne idée d'exclure les tables système, c'est-à-dire les tables qui démarrent "MSys" – Fionnuala

+1

OK, mais pourquoi auraient-elles une chaîne de connexion commençant par "ODBC"? Ils ne correspondent pas dans tous les cas. –

+1

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

5

Quelle est la version d'Access que vous utilisez? En 2000, vous pouvez aller dans Outils> Utilitaires de base de données> Gestionnaire de tables liées pour modifier vos paramètres.

+0

Merci - vous avez raison, cela fonctionne si j'utilise le gestionnaire de table lié et cochez la case "Toujours demander un nouvel emplacement", puis choisissez à nouveau l'ODBC. Je voudrais cependant relier la table au code - je vais éditer ma question pour clarifier cela. – BTB

+0

Pourquoi voudriez-vous relier votre table? Qu'est-ce qui sera gagné en faisant cela? – Brettski

+1

L'ODBC est modifié pour pointer vers un autre serveur/base de données, mais l'application Access ignore la modification jusqu'à son redémarrage. – BTB

Questions connexes