Относительные ссылки на таблицы в ms-access - PullRequest
3 голосов
/ 02 ноября 2009

Я уверен, что об этом уже спрашивали, но я не могу его найти.

Можно ли установить относительный путь для местоположения связанной таблицы в Access 2003?

Другая таблица также хранится в файле MDB. Эти базы данных иногда подключаются через odbc или oledb, поэтому использование кода vba, который срабатывает при открытии файла Access, не будет работать. Если возможно, я бы хотел, чтобы разделение базы данных было невидимым для подключающихся программ, а не для того, чтобы каждый раз проверять, связаны ли правильные таблицы.

Редактировать из-за комментариев:

Чтобы объяснить более четко; интересующий меня случай использования - это набор связанных баз данных доступа, которые все находятся в одном каталоге.

Если они скопированы как группа, все ссылки будут работать, но до обновления они будут указывать на неверные данные. Если Я открою файл mdb в Access, простой макрос vba может проверить и при необходимости обновить ссылки. Проблема в том, что в текущей настройке базы данных подключаются к гораздо чаще другими программами (через oledb / odbc), чем открывая их в Access .

Вопрос в том, нужно ли мне запускать обновление вручную каждый раз, когда я перемещаю файлы mdb, или есть какой-либо способ либо A) сделать ссылки относительными, либо B) инициировать проверку при установлении соединений?

Поскольку цель этого состоит в том, чтобы разделить существующую базу данных, я не хочу изменять подключающиеся программы для запуска этих проверок, если это не является определенно необходимым, отсюда и этот вопрос.

Ответы [ 2 ]

1 голос
/ 04 ноября 2009

Это очень интересный вопрос! Как предположил Радж Мур, при связывании таблиц путь становится абсолютным, поэтому опция А (относительные ссылки) не будет работать.

Что касается варианта B, вам придется самостоятельно перехватывать запрос на подключение и запускать необходимый код для повторного связывания таблиц - в Access нет встроенного средства, которое бы работало для вас из коробки. Даже если бы у вас было время собрать код вместе, чтобы сделать это, я думаю, вы обнаружите, что на практике это просто не очень выполнимо, как только вы начнете смотреть на семантику того, как это будет работать (например, ссылаетесь ли вы на все запрос? Что происходит, когда другой клиент подключается к базе данных, пока первый клиент выполняет запрос? Что происходит, если один клиент открывает несколько подключений к одной и той же базе данных mdb?)

Как вы уже упоминали, вы можете изменить клиентские приложения, чтобы связать таблицы при запуске, что сработало бы, но вам все еще, вероятно, нужно подумать о ситуации, когда более одного клиента пытается подключиться к одному и тому же внутреннему файлу MDB ( с). Даже если это не должно произойти, это вполне возможно. Другой момент, который следует учитывать, - это ремонтопригодность. Будет ли кто-то, кто следует за вами, осведомлен о том факте, что клиентские приложения выполняют эту перекомпоновку при запуске, и знает, не просто ли скопировать информацию строки подключения с одного клиентского ПК на другой, когда придет новый пользователь?

Я уверен, что есть отличная причина, по которой вы разбиваете mdb на два файла, но, учитывая небольшую часть информации, с которой мы работаем, как часть этого вопроса, мне интересно, даст ли их разделение достаточно выигрыш, чтобы перевесить потенциальные проблемы, которые могут возникнуть в будущем.

Если вы должны разделить базу данных и сохранить отдельные копии этих результирующих файлов mdb на общих сетевых ресурсах, я думаю, что наиболее безопасной альтернативой является написание процедуры VBA для повторного связывания таблиц в базе данных с использованием относительного дорожка. Когда вы копируете файлы в новый каталог, вам просто нужно выполнить процедуру один раз, чтобы связать таблицы.

0 голосов
/ 02 ноября 2009

Вы можете использовать относительные пути для связи таблиц, но в точке связывания относительный путь оценивается и переводится в абсолютный путь.

Если вы хотите продолжить использовать относительные пути, у вас должен быть макрос AutoExec, который запускает процедуру, которая связывает таблицы во время выполнения с вашим относительным путем.

Это, конечно, увеличит время запуска.

...