Внутреннее соединение между базами данных с множественным доступом

StackOverflow https://stackoverflow.com/questions/117558

  •  02-07-2019
  •  | 
  •  

Вопрос

Я перепроектирую приложение для CMS ASP.NET, которое мне очень не нравится.Я внес некоторые улучшения в производительность и обнаружил, что эта CMS не только использует MS SQL, но и некоторые пользователи «просто» используют базу данных MS Access.

Проблема в том, что у меня есть несколько таблиц, которые я объединяю внутри, и которые в версии MS Access находятся в двух разных файлах.Мне не разрешено просто перемещать таблицы в другой файл MDB.

Сейчас я пытаюсь найти хороший способ «внутреннего соединения» между файлами базы данных с множественным доступом?

Было бы очень жаль, если бы я получил все данные и сделал это программно!

Спасибо

Это было полезно?

Решение

Если у вас есть доступ к MDB и вы можете их изменять, вы можете рассмотреть возможность использования связанных таблиц.Access предоставляет возможность связываться с внешними данными (в других MDB, в файлах Excel, даже в SQL Server или Oracle), а затем вы можете выполнять соединения по ссылкам.

Я настоятельно рекомендую использовать такой вариант в тестировании производительности.Если возможно перенести пользователей баз данных Access в другую систему (даже SQL Express), это также было бы предпочтительнее — последний раз, когда я проверял, больше нет 64-битных драйверов JET для ODBC, поэтому, если приложение когда-либо размещается в в 64-битной среде эти пользователи будут уничтожены.

Другие советы

Вам вообще не нужны связанные таблицы.Существует два подхода к использованию данных из разных MDB, которые можно использовать без связанной таблицы.Первый — использовать «IN 'c:\MyDBs\Access.mdb» в предложении FROM вашего SQL.Один из ваших сохраненных запросов будет выглядеть так:

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

и другой сохраненный запрос будет:

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

Затем вы можете сохранить эти запросы, а затем использовать сохраненные запросы для объединения двух таблиц.

Альтернативно, вы можете управлять всем этим в одном операторе SQL, указав путь к исходному MDB для каждой таблицы в предложении FROM следующим образом:

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

Однако имейте в виду одну вещь:

Оптимизатор запросов Jet не обязательно сможет использовать индексы из этих таблиц для объединения (другой вопрос, будет ли он использовать их для критериев в отдельных полях), поэтому это может быть очень медленным (в моих тестах это не так, но я не использую большие наборы данных для тестирования).Но эта проблема с производительностью относится и к связанным таблицам.

Внутри одной БД доступа вы можете создавать «связанные таблицы», указывающие на другую БД.Вы должны (я думаю) иметь возможность запрашивать таблицы, как если бы они обе существовали в одной БД.

Это означает, что вам нужно изменить одну из БД, чтобы создать виртуальную таблицу, но, по крайней мере, вы на самом деле не перемещаете данные, а просто создаете на них указатель.

В Access вы можете добавлять удаленные таблицы через «Диспетчер связанных таблиц».Вы можете добавить ссылки на один или другой файл Access или создать новый файл Access, который ссылается на таблицы в обоих файлах.После этого запросы внутреннего соединения ничем не отличаются от выполнения их в одной базе данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top