#sql #excel #vba #ms-access
#sql #excel #vba #ms-access
Вопрос:
У меня есть база данных в MS Access 2016, и я запускаю запрос на обновление через Excel VBA. Иногда несколько пользователей могут выполнить эту операцию одновременно, а затем перезаписать свои данные, когда они не должны из-за условия в инструкции UPDATE.
Как заблокировать перезапись данных?
Когда я открываю таблицу в Access, между запуском запроса в VBA и информацией в таблице возникает задержка в несколько секунд. Может быть, проблема в этой задержке, и ее можно как-то устранить?
База данных разделена на FE и BE, а соединение является постоянным.
Мой запрос:
UPDATE
(SELECT TOP 1 ID, Col1, Update_time, Update_user
FROM Table1
WHERE Update_user Is Null
ORDER BY Col2 DESC , ID) AS U_ROW
SET U_ROW.Update_time = Now(), U_ROW.Update_user = [username];
В Excel VBA я запускаю это через ADODB.Команда:
With baseRecordsetCommand
.ActiveConnection = objectConnection
.CommandType = adCmdStoredProc
.CommandText = "qryTest"
.NamedParameters = True
.Parameters.Append .CreateParameter("@username", adVarChar, adParamInput, 255, Username)
.Execute recordsAffected
End With
Комментарии:
1. Можете ли вы опубликовать некоторые примеры данных, чтобы проиллюстрировать, почему
UPDATE
условие не соблюдается? Пожалуйста, покажите пример до и после для первого и второго пользователя приUPDATE
запуске. Тестирование с моей стороны, если не будут добавлены новые строки,UPDATE
должно обновлять только одну запись в первый раз и ноль записей впоследствии, посколькуUpdate_user Is Null
больше не будет сохраняться для следующего пользователя (ов).2. Почему задействован Excel?
3. Я предполагаю, что это связано с
LockType
свойством, установленным наRecordset
. Если у вас это установленоadLockBatchOptimistic
, то это бесплатно для всех, когда дело доходит до обновлений. Вероятно, вы захотите использоватьadLockPessimistic
LockType. Смотрите learn.microsoft.com/en-us/sql/ado/reference/ado-api /… для получения дополнительной информации.4. Проблема с @Parfait возникает только тогда, когда пользователи выполняют запрос одновременно. Когда разница составляет более 3 секунд, она работает нормально. Итак, я думаю, что данные хороши.
5. @June7 поскольку не у каждого пользователя есть Office Professional с MS Access или MS Access Runtime, его установка является проблемой.