Многопользовательская перезапись данных ADODB

#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, его установка является проблемой.