Взрыв из прошлого ... У меня была задача управлять устаревшим ADP Access 2000, используемым для управления данными, находящимися на сервере SQL 2005. На одной из форм данных каждый раз, когда я пытаюсь внести изменение в поле и сохранить его обратно в базе данных, оно истекает примерно через минуту. Увеличение лимита времени ожидания только задерживает отображение сообщения об ошибке времени ожидания. Я прошел все обычные способы устранения неполадок, чтобы обеспечить совместимость (см., Например, этот вопрос ).
Это настройка: форма привязана к набору записей (который считывается из базы данных как запрос SELECT * FROM table_name
. Размер результирующего набора варьируется в зависимости от фильтров, установленных в форме, но результат обычно составляет около 200 записей (не много данных ...). Некоторые поля формы запускают автоматическое сохранение в связанном обработчике событий, который выглядит примерно так:
Private Sub EndDate_Exit(Cancel As Integer)
some checking goes here...
...
DoCmd.RunCommand acCmdSaveRecord
End Sub
При выполнении кода DoCmd.RunCommand acCmdSaveRecord
ADP зависает до тех пор, пока не получит ошибку тайм-аута. Углубившись в это немного глубже, я посмотрел на Activity Monitor на SQL Server. acCmdSaveRecord
запускает оператор UPDATE
обратно на сервер, чтобы сохранить измененные данные. Сам оператор автоматически создается MS Access на основе первичного ключа базовой таблицы, который, по-видимому, определен правильно. Тем не менее обновление блокируется запущенным оператором SELECT
, что соответствует запросу SELECT * FROM table_name
, упомянутому выше.
Это приводит к тупику: изменение пользователя вызывает UPDATE
, который блокируется запущенным SELECT
(который, как представляется, возник из редактируемой формы). Как я могу обойти это?
Вещи, которые мы пробовали:
- Мы удалили оператор
DoCmd.RunCommand acCmdSaveRecord
и заменили его кодом Me.Dirty = False
, что приводит к тому же поведению, как описано выше.
- Удалено заполнение
acCmdSaveRecord
и использование встроенного меню доступа для сохранения изменений. Эта функциональность эквивалентна # 1 и ведет к точно такому же поведению.
- Замените вызов
acCmdSaveRecord
хранимой процедурой, которая сохраняет изменения в определенном поле. Прекрасно работает, за исключением того, что сохранение всей записи из GUI (кнопка сохранения, которая вызывает acCmdSaveRecord
) приводит к той же тупиковой ситуации.
- Уменьшен размер результирующего набора, связанного с формой, до нескольких записей. Как ни странно, все еще демонстрирует EXACT такое же поведение.