2008-09-22 7 views
3

Je suis en train de reconcevoir une application pour un CMS ASP.NET que je n'aime vraiment pas. J'ai fait quelques améliorations dans les performances pour découvrir que non seulement ce CMS utilise MS SQL, mais que certains utilisateurs utilisent "simplement" la base de données MS Access.Connexion interne sur plusieurs accès db

Le problème est que j'ai certaines tables que je joint à l'intérieur, qui avec la version MS Access sont dans deux fichiers différents. Je ne suis pas autorisé à simplement déplacer les tables vers l'autre fichier mdb.

J'essaie maintenant de trouver un bon moyen de "jointure interne" à travers plusieurs fichiers db d'accès?

Ce serait vraiment dommage si j'avais récupéré toutes les données et le faire par programmation!

Merci

Répondre

3

Si vous avez accès aux banques multilatérales de développement, et sont capables de les changer, vous pouvez envisager d'utiliser des tables liées. L'accès fournit la possibilité de lier à des données externes (dans d'autres MDB, dans des fichiers Excel, même dans SQL Server ou Oracle), puis vous pouvez effectuer vos jointures sur les liens.

J'encourage fortement les tests de performance d'une telle option. S'il est possible de migrer les utilisateurs des bases de données Access vers un autre système (même SQL Express), ce serait également préférable - après vérification, il n'y a plus de pilotes JET 64 bits pour ODBC, donc si l'application est déjà hébergée dans un environnement 64 bits, ces utilisateurs seront arrosés.

+0

Etes-vous sûr que des relations peuvent être implémentées avec des tables provenant de différentes bases de données? Je ne suis pas sûr qu'une instruction INNER JOIN serait réussie dans une telle situation (en fait je suis convaincu que vous obtiendrez une erreur!) –

+0

Oui, Access a permis des relations arbitraires entre les tables liées jusqu'à Windows 3.1 versions. Cependant, il récupère souvent toute la table à la volée, ce qui peut poser un problème avec les grandes tables. – user11318

1

À l'intérieur d'un DB d'accès, vous pouvez créer des «tables liées» qui pointent vers l'autre BD. Vous devriez (je pense) pouvoir interroger les tables comme si elles existaient toutes les deux dans la même base de données.

Cela ne signifie que vous devez changer l'un des blocs de données pour créer la table virtuelle, mais au moins vous n'êtes pas réellement déplacer les données, juste faire un pointeur vers elle

0

Dans Access, vous pouvez ajouter à distance tables via le "gestionnaire de tables liées". Vous pouvez ajouter les liens à un fichier Access ou l'autre, ou vous pouvez créer un nouveau fichier Access qui référence les tables dans les deux fichiers. Après cela, les requêtes de jointure interne ne sont pas différentes de les faire dans une seule base de données.

11

Vous n'avez pas du tout besoin de tables liées. Il existe deux approches pour utiliser des données provenant de différentes BMD pouvant être utilisées sans table liée. Le premier est d'utiliser "IN 'c: \ MyDBs \ Access.mdb'" dans la clause FROM de votre SQL. L'un de vos requêtes enregistrées serait comme:

SELECT MyTable.* 
FROM MyTable IN 'c:\MyDBs\Access.mdb' 

et l'autre requête enregistrée serait:

SELECT OtherTable.* 
FROM OtherTable IN 'c:\MyDBs\Other.mdb' 

Vous pouvez ensuite enregistrer ces requêtes, puis utilisez les requêtes enregistrées pour joindre les deux tables.

Vous pouvez gérer tout en une seule instruction SQL en spécifiant le chemin vers le MDB source pour chaque table dans la clause FROM ainsi:

SELECT MyTable.ID, OtherTable.OtherField 
FROM [c:\MyDBs\Access.mdb].MyTable 
    INNER JOIN [c:\MyDBs\Other.mdb].OtherTable ON MyTable.ID = OtherTable.ID 

garder une chose à l'esprit, cependant:

L'optimiseur de requête Jet ne sera pas nécessairement capable d'utiliser les index de ces tables pour la jointure (qu'il utilise une autre question pour les critères sur des champs individuels), donc cela peut être extrêmement lent (dans mes tests, il est pas, mais je n'utilise pas de gros jeux de données pour tester). Mais ce problème de performance s'applique également aux tables liées.

+0

Wow. Combien de fois parvenez-vous à dire que vous avez appris quelque chose de nouveau à propos d'Access aujourd'hui? Je n'ai pas utilisé Access depuis des années, mais c'est douloureux de réaliser combien de temps ce simple savoir m'aurait sauvé à l'époque. – MusiGenesis

+0

Il est dommage que le moteur de base de données Jet ait une réputation si ternie, car c'est vraiment un moteur remarquable. Sa capacité à se connecter avec autant de types différents de données (simultanément) et à prendre des décisions intelligentes sur l'optimisation de la récupération de données est inégalée sur n'importe quelle autre plate-forme. –