На самом деле, я нашел способ имитировать доступ одного пользователя для чтения и записи через тип взломанного блокировки. Ниже описано, как я это достиг.
Итак, я сделал небольшой стол в доступе, скажем, под названием Lock
, и имеет один столбец под названием SomeValue
. Этот столбец должен быть первичным ключом, и он может быть любого значения, поэтому я сделал его, например, типа. В этой таблице будут храниться все блокировки, которые будут сделаны в ней, а стороны, которые пытаются получить блокировку, должны согласовать значение блокировки. Например, два клиента попытаются получить блокировку значения 1, поэтому они должны запросить блокировку 1 и заблокировать блокировку 1.
Во-первых, здесь две вспомогательные запросы, которые я сделал, чтобы установить и снять блокировку, пропусканием значение замка стороны, которые пытаются приобрести его:
SetLock запроса:
INSERT INTO Lock (SomeValue)
VALUES ([GetLockValue]);
ReleaseLock запрос:
DELETE *
FROM Lock
WHERE SomeValue=[GetLockValue];
Тогда вот TrySetLock функция (которая попытается установить блокировку переданному в значение и возвращает набор результатов, где 1 является пропуском, и 0 является метрономы ил) и SetLock Sub (который будет ждать до замка по переданному в значение пусто, чтобы приобрести его - он использует метод спин блокировки для блокировки приобретения):
Public Function TrySetLock(LockValue As Integer) As Integer
Dim dbs As dao.Database
Dim qdf As dao.QueryDef
Set dbs = CurrentDb
Set qdf = dbs.QueryDefs("SetLock")
qdf.Parameters("GetLockValue").Value = LockValue
qdf.Execute
TrySetLock = qdf.RecordsAffected
End Function
Public Sub SetLock(LockValue As Integer)
Do While TrySetLock(LockValue) = 0
Loop
End Sub
А вот ReleaseLock Sub (который будет выпускать блокировка по переданным в значении - это Sub всегда будет успешным, даже если там нет такой блокировки не существует):
Public Sub ReleaseLock(LockValue As Integer)
Dim dbs As dao.Database
Dim qdf As dao.QueryDef
Set dbs = CurrentDb
Set qdf = dbs.QueryDefs("ReleaseLock")
qdf.Parameters("GetLockValue").Value = LockValue
qdf.Execute
End Sub
Как вы можете видеть здесь, я использовал помощь первичного ключа свойства SQL и Microsoft Таблицы доступа, чтобы убедиться, что вставка (или как указано здесь путем блокировки) может быть успешной только для одной стороны или клиента за раз, и никогда не будет успешной для другой стороны, если только первая сторона удаляет (или освобождает) блокировку того же значения блокировки, с которой согласны обе стороны.
Однако это может вызвать проблему блокировки ВСЕХ клиентов, полагающихся на одну и ту же блокировку, если один клиент не смог освободить блокировку (скажем, программа клиента заморожена и вынуждена была убить программу). Я хотел бы знать, будут ли вызваны деструкторы для модулей класса, когда программа будет убита или нет? Если он вызван, то я думаю, что эту проблему можно устранить, сделав класс блокировки с некоторым значением, а destuctor этого класса освободит блокировку и не заставит других клиентов ждать этой определенной блокировки.
это начало того, что вы хотите http://stackoverflow.com/questions/5792169/opening-access-database-in-exclusive-mode#answer-5792773 –