Состояние доступа к MS Access во время выполнения заявления

Задний план

Я разработал ряд инструментов тактического сбора данных, все из которых используют один и тот же подход для разделения спереди и сзади:

  • Excel VBA формирует бэк-интерфейс (используя ADO для подключения к задней части)
  • База данных Access 2007 (accdb) в качестве задней части

Мое предпочтение было бы использовать SQL Server в качестве задней части, но это невозможно из-за ограничений, которые я не могу решить.

Каждый распределенный инструмент имеет различное количество пользователей, использующих инструменты одновременно (в любом месте от 10 до 300+). Я понимаю, что Access – это не идеальное решение, дающее потенциальное количество одновременных пользователей, но еще раз, это не под моим контролем.

Когда инструменты используются, пользователи иногда получают. The database has been placed in a state by user 'Admin' on machine '***' that prevents it from being opened or locked. ошибка.

Учитывая объем транзакций, ошибка возникает примерно в 0,001% случаев.

Я прочитал ряд статей по этой теме, большинство из которых заканчиваются предположением, что объект в базе данных изменяется или что пользователь входит в Design Mode который должен быть рассмотрен с помощью раздельного переднего и заднего конца.

Вопрос

Выполняется ряд различных типов запросов, включая SELECT и INSERT INTO . Пользователи напрямую не обращаются к файлу базы данных, и поэтому объект не изменяется и ничего не помещается в Design Mode поэтому почему пользователи испытывают эту ошибку? Это связано с количеством сдвиговых пользователей?

Я использую тот же подход к подключению к базе данных, используя следующий метод:

 Public Function fGetOrderStatus() As Variant() Dim oDB As ADODB.Connection Dim oCM As ADODB.Command Dim oRS As ADODB.Recordset On Error GoTo Err: Set oDB = New ADODB.Connection oDB.Open gcConn Set oCM = New ADODB.Command With oCM .ActiveConnection = oDB .CommandText = "SELECT OrderStatusId, OrderStatus FROM ct_elh_OrderStatus WHERE Deleted Is Null" .CommandType = adCmdText Set oRS = .Execute End With If Not oRS.BOF And Not oRS.EOF Then fGetOrderStatus = oRS.GetRows() Else Erase fGetOrderStatus End If oRS.Close Set oRS = Nothing oDB.Close Set oDB = Nothing Exit Function Err: MsgBox ("An unexpected error occurred. Please try again later."), vbCritical, "Error" End Function 

Причиной этой ошибки является следующее:

Jet блокирует блок из 256 бит в заголовке MDB. В этот блок бит включены биты, которые указывают на «пассивное выключение», что вызывает появление сообщения об ошибке, описанного в разделе «Проблема». У вас могут быть пользователи, которые быстро открывают и закрывают файл MDB, а биты не разблокируются достаточно быстро. Когда пользователь пытается открыть файл MDB, если программа не может читать биты, Jet предполагает, что пользователь находится в «пассивном выключении» или «режиме администратора» и, следовательно, не позволит пользователю открыть файл MDB ,

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

Более подробную информацию можно найти здесь.

  • Выбор только одной строки из листа excel (как часть слияния)
  • Экспорт таблицы из SQL Server в Excel 2007 с использованием C #
  • owa_util.mime_header Проблема - попытка извлечь файл Excel из запроса
  • Обновление запроса мощности изменяет ссылки на формулы и не копирует формулы таблицы
  • Результаты SQL-запросов записываются в Excel
  • Excel ODBC Data Connection Время выполнения запроса для обновления каждого запроса
  • Можно ли установить внешний ключ между двумя листами Excel?
  • Какой процесс следует выполнять с командами mysql и что делать с Java?
  • Импортировать определенные строки и столбцы из Excel для доступа
  • Вставить в первую строку Excel
  • Импорт SQL Server 2005 из Excel
  • Давайте будем гением компьютера.