2009-05-12 7 views
7

Mon scénario: L'ordinateur A possède une base de données Access contenant des tables liées. Ces tables liées résident en réalité dans une autre base de données Access sur l'ordinateur B. Rien d'inhabituel pour le moment.Comment chaîner des tables liées dans Access?

Maintenant, nous créons une base de données SQL Server, et établissons des liens vers ces tables dans la base de données Access sur l'ordinateur B; nous configurons une DSN machine pour définir la connexion ODBC nécessaire sur l'ordinateur B. La base de données d'accès B contient à présent à la fois des tables locales et des tables SQL liées.

La base de données d'accès A doit maintenant être liée aux nouvelles tables de la base de données Access - mais seules ses tables locales apparaissent dans la boîte de dialogue pour ajouter une table liée. Il semble que vous ne pouvez pas "lier à une table liée" dans Access ...

Mais est-ce vrai? Ce que nous voulons faire est de présenter les liens de la table SQL de la base de données B vers la base de données A comme s'il s'agissait de tables locales; c'est-à-dire que la base de données A ne sait pas que les nouvelles tables de la base de données B ne sont pas réellement locales.

Bien sûr, nous pourrions lier les tables SQL directement dans la base de données A en configurant un DSN sur cet ordinateur, mais nous ne voulons pas faire cela. Nous aimerions utiliser l'ordinateur/base de données B comme un lien ou une «passerelle» qui présente à la fois les tables locales et SQL de manière transparente aux autres applications clientes d'accès sur le réseau. Ce n'est qu'une configuration temporaire qui nous permettrait de migrer progressivement toutes les applications client Access vers des tables SQL Server, sans avoir à modifier beaucoup de code.

Est-ce que cela peut être fait? Existe-t-il une autre solution ou un scénario réalisable auquel nous n'avons pas pensé?

+1

Vous n'avez besoin d'aucune source de données sur aucune machine - utilisez plutôt une chaîne de connexion sans DSN. –

Répondre

5

Non - vous ne pouvez relier aux tables réelles - vous devez recréer les liens du serveur SQL que vous avez fait sur la base de données B pour la base de données A

Si les données du serveur SQL ne change pas beaucoup et vous êtes juste à l'utiliser pour vous pouvez importer les données dans de véritables tables d'accès auxquelles vous pouvez créer un lien.

EDIT

Une autre solution consiste à relier les tables dynamiquement - de cette façon vous ne devez pas ajouter le DSN manuellement à chaque ordinateur.Utilisez un quelque chose de chaîne de connexion comme ceci:

ODBC;Driver={SQL Server};Server=<server name/IP>;Database=<database>;UID=<user>;PWD=<password> 

Ce lien entre une table

Dim db As Database 
Dim TD As TableDef 
Dim sTableName As String ''MS Access name (can be same as SQL Server name) 
Dim sServerTableName As String ''SQL Server Name 

sTable = "Table1" 
sServerTableName = "dbo.Table1" 
sServerConnect = "ODBC;Driver={SQL Server};Server=Localhost;Database=DB1;" 

Set TD = db.CreateTableDef(sTableName) 
TD.Connect = sServerConnect 
TD.SourceTableName = sServerTableName 

db.TableDefs.Append TD 
db.TableDefs.Refresh 
0

Pourriez-vous créer une requête/vue sur B qui est juste une vue de la table liée sur C, afin que A puisse alors accéder à la requête/vue sur B (qui est en fait la table sur C)?

comme:

 

Linked Query on A  ->  Query on B 
           : 
         Linked table on B  -> Real table on C 

modifier après commentaire: OK, apparemment, vous ne pouvez pas lier aux requêtes, donc cela ne fonctionne pas alors.

Une autre idée: Pouvez-vous configurer la réplication entre B et C afin que toutes les tables de C soient répliquées vers B, où A peut y accéder?

+0

Vous ne pouvez pas créer de lien vers des requêtes ... –

+0

Qu'entendez-vous par "réplication?" Si vous voulez dire la réplication Jet, non, cela ne fonctionne pas ainsi, et les tables liées ODBC présentent plusieurs problèmes dans une MDB répliquée. –

+0

Oui, je voulais dire la réplication Jet. OK ressemble à cette idée ne va pas aider non plus. – codeulike

0

En ce qui concerne la suggestion de requête, il est possible d'utiliser une clause IN 'C:\OtherDatabase.mdb' dans une clause FROM:

SELECT qryMyTable.* 
FROM qryMyTable IN 'c:\OtherDatabase.mdb'; 

Cela affichera pour vous dans la base de données où la requête est stockée le contenu de la requête dans l'autre base de données. Si ce chemin d'accès à l'autre base de données ne change pas, vous pouvez utiliser cette méthode pour se greffer sur les tables liées de cette autre base de données.

+0

Cela suppose que les deux bases de données partagent le même fichier de groupe de travail. – onedaywhen

+0

Si ce n'est pas le cas, vous pouvez fournir une chaîne de connexion complète avec les informations d'authentification appropriées et l'emplacement du fichier de groupe de travail approprié. –

+0

Comment spécifiez-vous le chemin d'accès au fichier de groupe de travail (mdw)? J'ai abandonné il y a des années après qu'un Access MVP m'ait finalement convaincu que cela ne serait pas possible en raison de l'architecture de Jet. Mais si vous savez comment le faire, je serais ravi d'apprendre. Dites-vous ce que: Je vais commencer une nouvelle question sur SO et vous pouvez gagner quelques rep en y répondant :) Regardez cet espace ... – onedaywhen

Questions connexes