Что это за ошибка доступа? В данный момент у вас нет эксклюзивного доступа к базе данных - PullRequest
1 голос
/ 21 октября 2010

Протестировано на Access 2003 Pro (сборка 11.8321.8324) SP3.

Шаги для воспроизведения:

  • создать новую базу данных.
  • создать новую форму.
  • поставить кнопку на форме.
  • вставьте следующий код в процедуру события нажатия кнопки:

Debug.Print Workspaces.Count
Debug.Print CurrentDb.Name

  • закрыть редактор кода и форму, сохранив изменения.
  • не пропустите этот шаг : закройте Access.
  • повторно открыть Access и вашу базу данных.
  • открыть форму
  • нажмите на кнопку
  • нажмите кнопку на панели инструментов, чтобы переключить форму в режим конструктора.

Вы должны увидеть следующее диалоговое окно с ошибкой:

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

Access error dialog

Кто-нибудь знает, что здесь происходит?

1 Ответ

0 голосов
/ 21 октября 2010

Простой обходной путь - вызвать CurrentDb перед первым вызовом Workspaces:

Debug.Print CurrentDb.Name
Debug.Print Workspaces.Count
Debug.Print CurrentDb.Name

Я попытаюсь объяснить, что происходит, но это только моя теория.

Соответствующие биты файла справки Access следующие (для CurrentDb):

Примечание В предыдущих версиях Microsoft Access вы могли использовать синтаксис DBEngine.Рабочие пространства (0) .Databases (0) или DBEngine (0) (0) для возврата указателя на текущую базу данных.В Microsoft Access 2000 вместо этого следует использовать метод CurrentDb. Метод CurrentDb создает другой экземпляр текущей базы данных, а синтаксис DBEngine (0) (0) ссылается на открытую копию текущей базы данных. Метод CurrentDb позволяет создавать более одной переменной типаБаза данных, которая ссылается на текущую базу данных.Microsoft Access по-прежнему поддерживает синтаксис DBEngine (0) (0), но вы должны рассмотреть возможность внесения этой модификации в свой код, чтобы избежать возможных конфликтов в многопользовательской базе данных.

А для коллекции Workspaces:

Когда вы впервые ссылаетесь на объект рабочей области или используете его, вы автоматически создаете рабочее пространство по умолчанию , DBEngine.Workspaces (0).

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

Конечно, это все догадки, и мне так же любопытно, как и вам знать "реальный ответ".

...