Поддерживает ли ACEDAO блокировку уровня строки?

Проблема с DAO 3.6 заключалась в том, что она не поддерживала блокировку на уровне строк. Подробнее см. эта база знаний.

Я узнал из Блог группы разработчиков:

В Office Access 2007 новые объекты, свойства и методы будут добавлены DAO для поддержки новых функций в механизм доступа к базе данных.

От взгляда на эту библиотеку в браузере объектов Visual Basic редактора Access2007, что новое воплощение называется ACEDAO. Я могу найти упоминание acedao.dll в исправлениях на MSDN, но ничего больше.

Кто-нибудь знает, где можно найти документацию для конечного пользователя для ACEDAO?

Как узнать, поддерживает ли ACEDAO блокировку на уровне строк?

Ответ 1

Я не верю, что это было изменение в этой статье базы знаний. Однако вы должны иметь в виду, как была зафиксирована блокировка записи.

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

Любые существующие пользователи с блокировкой строк будут принудительно блокировать блокировку записи THAT, которую они используют. И, поскольку очень редко, что этот код набора записей будет держать запись открытой/заблокированной в течение любого разумного промежутка времени, тогда блокировка страницы или блокировка строк редко будут иметь значение здесь. Поэтому в большинстве случаев блокировка необходима, когда у вас есть пользователь, редактирующий данные в форме. В случае кода это, как правило, редкая проблема.

Таким образом, параметры пользователя в параметрах tools- > действительно определяют этот выбор для пользователя. Чтобы быть действительно ясными здесь и не расщеплять волосы, эта функция блокировки строк для пользовательского интерфейса действительно не отменяет выбор, так как по умолчанию он СИЛИЗИВАЕТ проблему.

Помните, как работает блокировка строк, когда вы включаете эту функцию, реактивный двигатель просто расширяет размер записи до одной страницы и поэтому просто использует обычную старую блокировку страниц, как раньше. Это то, что я имею в виду под воздействием этой проблемы. Это не приведет к тому, что холм beans отличается, если пользователь включил блокировку строк, а затем попытался захватить запись, заблокированную пользователем с набором записей, который не открыл reocrdsset с блокировкой строк (в отличие от блокировка страницы). Вам не разрешается блокировать и редактировать запись, потому что это снова возвращается к разрешению страницы.

Нет такой вещи, как настоящая блокировка строки. Однако, если вы увеличиваете размер записи на всегда одну страницу, то вы достигаете той же цели обходным путем.

Учитывая приведенную выше информацию, это означает две вещи:

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

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

Логически это означает, что этот параметр действительно полезен только для пользователей, редактирующих данные КОГДА они срабатывают друг над другом. Однако для кода набора записей он редко помогает или даже подходит для использования блокировки строк.

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

Вы можете обнаружить, что ACE + dao может открыть reocrdset с блокировкой строк, но зачем беспокоиться? Ты не пользуешься дао, и тебе все равно не нравится. И, в любом случае, это не похоже на изменение пользовательских сценариев.

- изменить:

У меня нет ссылки, которая объясняет эту блокировку записи. Я знаю, что я читал это где-то, но у меня нет ссылки.

Я был очень занят в течение последних нескольких дней (я являюсь частью бета-версии Access 2010, а в понедельник также выпущен CTP для публичных людей, которые подписались). Итак, я был очень занят в последнее время.

Однако вы можете попробовать код, который покажет это. Следующий код вызывает около 1 мегакраса раздувания в mdb с блокировкой NO row. (от 5,8 до 6,5).

Dim rst        As DAO.Recordset
Dim i          As Long
Dim t          As Single

Set rst = CurrentDb.OpenRecordset("contacts")

t = Timer
Me.Text1 = "working..."
DoEvents
Do While rst.EOF = False
   rst.Edit
   i = i + 1
   rst!City = "ci " & i
   rst.Update

   rst.MoveNext

   If i Mod 500 = 0 Then
      Me.Text1 = i
      DoEvents
   End If


Loop

t = Timer - t
Me.Text1 = "done in " & t & " seconds"
Beep

Если запустить код SAME с блокировкой записи, файл становится колоссальным размером в 123 мегабайта. Вот ссылка на образец mdb с указанным выше кодом

http://www.kallal.ca/test/bloat.zip

Итак, скачайте выше. Запустите его с помощью инструментов- > options- > advanced- > open с блокировкой уровня строки.

Затем очистите таблицу. Компактность и ремонт. Измените приведенную выше настройку и запустите ее снова (убедитесь, что вы выходите, а затем повторно введите базу данных после изменения этой настройки).

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

Ответ 2

ACEDAO по крайней мере, и, скорее всего, DAO использует блокировку уровня записи по умолчанию, независимо от документации MS. Об этом может свидетельствовать раздувание (упомянутое выше), которое происходит после переключения из базового Access 97 DB в Access 2000 или ACCDB с использованием того же кода DAO.

Подробнее см. мой ответ здесь:

Лучше ли использовать ADO или DAO в Access 2007?

Отредактировано для отражения ссылки MSDN, содержащей правильную информацию:

"Блокировка уровня записи является значением по умолчанию для объектов ADO и DAO Recordset. Блокировка уровня страницы является стандартным для операторов SQL DML (массовые операции, такие как UPDATE, DELETE и INSERT INTO), которые используют объекты ADO Command или DAO Объекты QueryDef."

http://msdn.microsoft.com/en-us/library/aa165435(office.10).aspx