Мне нужно найти способ получить уникальную «Проверку» из базы данных MS Access в многопользовательской среде.Вот мой пример таблицы:
Проверка поля уже заполнена и никогда не будет изменяться, mID и getDate добавляются / удаляются пользователем (используя VBAscript).
Правило для сценария VBA:
1. Найдите первую свободную строку mID,
2. Заполните ее текущим именем пользователя и текущей датой,
3. Верните соответствующее поле проверки
Кажется, что это легко сделать, вот код, который я разработал:
Function access() As String
Dim con As ADODB.Connection
Dim Records As ADODB.Recordset
Dim record As ADODB.record
Set con = New ADODB.Connection
Set Records = New ADODB.Recordset
Set record = New record
con.ConnectionString = sDBPath
con.Open
With Records
.ActiveConnection = con
.Source = "tblVerificationNr"
.LockType = adLockOptimistic
.CursorType = adOpenDynamic
.Open
Do Until .EOF
If IsNull(.Fields("mID")) Then
access = .Fields(1)
.Fields("mID") = "asdf"
.Fields("getDate") = Now
.Update
Exit Do
End If
.MoveNext
Loop
End With
End Function
Код работает хорошо для 1 пользователя, но когда несколько пользователей начинают запрашивать его (почти) одновременно, тогда ониполучить тот же номер подтверждения.(Если пользователь2 отправит запрос на 0,1 сек позже, чем пользователь1, то он найдет ту же строку - Verification = 3006. В результате первый пользователь1 введет свой mID, а getDate AND получит подтверждение = 3006, но спустя 0,1 сек. User2перезапишет эти данные и получит тот же проверочный номер).
Каким будет обходной путь для этого?Как обеспечить уникальность проверки?Возможно ли заблокировать найденную запись пользователем user1, чтобы user2 не смог найти эту запись?
Пробовал также с помощью операторов SQL:
sSelectSQL = "SELECT TOP 1 tblVerificationNr.VerificationNumber, tblVerificationNr.Mid, tblVerificationNr.getDate FROM tblVerificationNr WHERE (((tblVerificationNr.[mID]) = '" & UserName() & "')) ORDER BY tblVerificationNr.getDate DESC, tblVerificationNr.ID"
sUpdateSQL = "UPDATE (SELECT TOP 1 tblVerificationNr.VerificationNumber, tblVerificationNr.Mid, tblVerificationNr.getDate FROM tblVerificationNr WHERE (((IsNull([tblVerificationNr].[mID]))<>False)) ORDER BY tblVerificationNr.VerificationNumber) AS a SET a.mID = '" & UserName() & "', getDate = '" & Now() & "'"
и та же проблемаздесь.