En fait, j'ai trouvé un moyen de simuler l'accès mono-utilisateur pour la lecture et l'écriture à travers un type de verrou hacky composé. Ce qui suit décrirait comment je l'ai réalisé. Donc, j'ai fait une petite table en accès, disons Lock
, et j'ai une colonne appelée SomeValue
. Cette colonne doit être une clé primaire, et elle pourrait être de n'importe quelle valeur, donc je l'ai fait du type number, par exemple. Cette table stockera tous les verrous qui seront faits dedans, et les côtés qui essayent d'acquérir le verrou doivent s'accorder sur la valeur du verrou. Par exemple, deux clients vont essayer d'acquérir le verrou de la valeur 1, ils doivent donc demander le verrou 1 et libérer le verrou 1.
Tout d'abord, voici deux requêtes d'aide que j'ai fait pour régler et libérer le verrou, en faisant passer la valeur du verrou sur les côtés qui tentent d'acquérir:
requête SetLock:
INSERT INTO Lock (SomeValue)
VALUES ([GetLockValue]);
ReleaseLock requête:
DELETE *
FROM Lock
WHERE SomeValue=[GetLockValue];
Alors, voici la fonction TrySetLock (qui tenterait de régler le verrou du passé en valeur, et renvoie les résultats fixés, où 1 est un laissez-passer, et 0 est une fa il) et SetLock Sub (qui attendra jusqu'à ce que le verrou par le passé en valeur est vide pour l'acquérir - il utilise la méthode de verrouillage de rotation pour l'acquisition de verrouillage):
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
Et voici la ReleaseLock Sub (qui libérerait le verrou par le passé en valeur - ce sous toujours réussir, même si une telle serrure existe):
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
Comme vous pouvez le voir ici, j'ai utilisé l'aide de la propriété clé primaire de SQL et Microsoft Accédez aux tables pour vous assurer que l'insertion (ou comme indiqué ici par le verrouillage) ne peut réussir que pour un côté ou un client à la fois, et ne réussira jamais pour l'autre côté à moins que le Le premier côté retire (ou libère) le verrou de la même valeur de la serrure des deux côtés. Cependant, cela poserait un problème de blocage de TOUS les clients utilisant un même verrou si un client ne réussissait pas à libérer le verrou (disons que le programme d'un client est gelé et qu'il a dû forcer le programme). Je voudrais savoir si les destructeurs pour les modules de classe seront appelés quand un programme est forcé d'être tué ou non? Si elle est appelée, alors je pense que ce problème peut être résolu en faisant une classe de verrou avec une certaine valeur, et le destutor de cette classe libère le verrou, et ne pas avoir à faire attendre d'autres clients pour ce verrou certain.
Ceci est le début de ce que vous voulez http://stackoverflow.com/questions/5792169/opening-access-database-in-exclusive-mode#answer-5792773 –