Объекты доступа к данным (DAO) Свойство LastUpdated возвращает неправильные даты/время в базу данных Microsoft Access


Расширенный: Требует экспертного кодирования, совместимости и многопользовательских навыков.Эта статья относится только к базе данных Microsoft Access (.mdb).

Проблемы


Объекты доступа к данным (DAO) LastUpdated собственности возвращает неправильные даты / времена для Microsoft Access формы, отчеты, макросы и модули.

Причина


Microsoft Access не уведомляет движок базы данных Microsoft Jet об изменении объектов, кондиссивизмконкретных (форм, отчетов, макросов и модулей); поэтому столбец DateUpdate в таблице MSysObjects никогда не обновляется до правильной даты и времени. То же самое относится и к Microsoft Access 2007, которая использует движок базы данных Microsoft Access.

Статус


Корпорация Майкрософт подтвердила, что это проблема в продуктах Майкрософт, которые перечислены в начале этой статьи.

Дополнительная информация


Свойство LastUpdated, предоставляемое DAO, возвращает правильную дату/время для объектов движка базы данных (таблицы, запросы и отношения), но возвращает только дату создания, а не последнюю измененную дату для конкретных объектов Microsoft Access (формы, отчеты, макросы и модули). До Microsoft Access 2000 Microsoft Access использовала файл базы данных Jet (.mdb) для хранения как объектов базы данных (таблиц, запросов и отношений), так и объектов Microsoft Access (формы, отчеты, макросы и модули). Microsoft Access хранила свои конкретные объекты в таблицах jet system, в частности на таблицах MSysObjects и MSysModules (или MSysModules2). Столбец DateUpdate в таблице MSysObjects отвечает за хранение последней даты изменения объекта и является столбцом, который свойство DAO LastUpdated использует для возврата последней измененной даты объекта. Когда пользователь модифицировал и сохранил объект в более ранних версиях, Microsoft Access уведомила движок базы данных Jet о том, что объект был изменен, и Jet обновил столбец DateUpdate до текущей даты и времени. Microsoft Access 2000 представила файлы проекта Access (.adp), которые имеют возможность подключения непосредственно к базам данных Microsoft S'L Server без использования движка базы данных Jet. Поскольку файлы ADP не используют движок базы данных Jet (или движок базы данных доступа), Access не может использовать тот же формат хранения, который ранее использовался в базах данных Jet для объектов, специфийных для доступа. Он должен был хранить их в новом формате хранения документов OLE, который доступен как в базах данных Jet, так и в проектах Access. Когда пользователь первоначально создает новый объект Microsoft Access, например форму), движок базы данных по-прежнему вводит текущую дату и время в столбцы DateCreate и DateUpdate в таблице MSysObjects. Однако, когда пользователь изменяет и сохраняет объект, Microsoft Access не уведомляет движок базы данных; поэтому столбец DateUpdate всегда остается неизменным. Кроме того, вы могли заметить, что окно базы данных (в версиях до Access 2007) и навигационный pane в Access 2007 или Access 2010 отображают правильную дату и время последней модификации объекта. Это связано с тем, что Microsoft Access использует свой собственный внутренний механизм для хранения созданной даты и изменения даты, независимо от движка базы данных. К сожалению, Microsoft Access не разоблачает эту информацию в своей объектной модели; таким образом, нет никакого программного способа, чтобы добраться до этой информации в Microsoft Access.

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

  1. Запустите Доступ к Microsoft, а затем создайте новую пустую базу данных.
  2. Создайте новую, пустую форму в представлении Design.
  3. Добавьте текстовый ящик в форму.
  4. Сохранить форму как frmLastUpdated, а затем закрыть его.
  5. В Access 2003 и более ранних версиях Access выберите меню Просмотра и нажмите Подробнее. В Access 2007 или Access 2010, право нажмите на заголовок категории в навигационный pane слева и нажмите Просмотр Подробная информация. При этом отображаются измененные и созданные даты для каждого объекта. Обратите внимание, что как измененные, так и созданные столбцы для формы frmLastUpdated установлены на одну и ту же дату и время.
  6. Нажмите на CTRL-G, чтобы открыть немедленное окно в визуальном базовом редакторе. (В Access 2007 или Access 2010 необходимо сначала включить содержимое или базу данных, которая должна находиться в надежном месте.)
  7. Введите следующую строку в немедленное окно, а затем нажмите ENTER:
    ?CurrentDb.Containers("Forms").Documents("frmLastUpdated").LastUpdated
    Обратите внимание, что дата и время возврата соответствуют измененным и созданным столбцов в окне базы данных.
  8. Нажмите на ALT-F11, чтобы вернуться к Microsoft Access.
  9. Откройте форму frmLastUpdated в представлении дизайна.
  10. Добавьте второй текстовый ящик в форму, а затем сохраните и закройте его. Обратите внимание, что измененная колонка в окне базы данных содержит обновленную дату и время для формы.
  11. Повторите шаги 7 и 8.
Заметка Свойство LastUpdated по-прежнему возвращает исходную дату и время вместо новой даты и времени, отображаемых в измененной колонке в окне базы данных.