Почему я не могу повторно связать таблицу с vba, используя метод CurrentDB () напрямую? - PullRequest
2 голосов
/ 15 апреля 2011

Может кто-нибудь объяснить, почему первый пример кода работает, а второй нет?

Этот код повторной ссылки работает:

Dim db As Database
Dim sNewLinkAddress As String

sNewLinkAddress = "C:\temp\backend.accdb"
Set db = CurrentDb

db.TableDefs("table1").Connect = ";Database=" & sNewLinkAddress
db.TableDefs("table1").RefreshLink

Этот код повторной ссылки НЕ работает, но сообщения об ошибках не выдаются:

Dim sNewLinkAddress As String

sNewLinkAddress = "C:\temp\backend.accdb"

CurrentDb().TableDefs("table1").Connect = ";Database=" & sNewLinkAddress
CurrentDb().TableDefs("table1").RefreshLink

Что меня беспокоит, так это то, что есть фундаментальное различие, о котором я не знаю, между использованием объекта базы данных, непосредственно возвращаемого функцией CurrentDB (), и использованием переменной 'db', которая установлена ​​для объекта базы данных, возвращаемого функцией CurrentDB (). На мой взгляд, оба пути должны быть идентичными, но, очевидно, я ошибаюсь!

В прошлом я использовал CurrentDB () напрямую для различных задач, таких как открытие набора записей без проблем. Кажется, есть определенная проблема с перекомпоновкой таблиц. Есть идеи, что здесь происходит?

Я использую Access 2007, но та же проблема относится и к 2003 году.

1 Ответ

6 голосов
/ 15 апреля 2011

Каждый раз, когда вы вызываете CurrentDb(), он возвращает новый экземпляр объекта базы данных.

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

Итак, в первом примере вы используете присвоение возвращаемого значения CurrentDb объекту базы данных db. Затем каждый раз, когда вы вызываете db, вы ссылаетесь на один и тот же экземпляр объекта базы данных:

Set db<A> = CurrentDb

db<A>.TableDefs("table1").Connect = ";Database=" & sNewLinkAddress
db<A>.TableDefs("table1").RefreshLink

Во втором примере вы делаете несколько вызовов функции CurrentDb, и каждый вызов возвращает другой экземпляр объекта базы данных:

CurrentDb()<B>.TableDefs("table1").Connect = ";Database=" & sNewLinkAddress
CurrentDb()<C>.TableDefs("table1").RefreshLink

В результате, когда вы вызываете RefreshLink во второй строке, вы делаете это для совершенно нового экземпляра объекта базы данных; т.е. тот, чье свойство Connect "table1" не было изменено

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...