在Access 2003数据库中,我在idPersonnel (employee)和idSession两个字段上有一个带有主键的“铭文”(订阅)数据库。我已经做了一个表单,这样用户就可以选择一个会话(在列表框中),然后选择一个或多个员工(另一个列表框),然后使用一个按钮将它们输入到该会话中,该按钮在VBA端首先检查会话上是否有足够的空间(由"MaxParticipants“字段定义,链接到idSession上的”铭文“表),然后在”铭文“表中插入数据。
这在单用户环境中运行良好,但如果两个人希望同时在同一会话中加入一些员工,则会失败,因为我在检查和插入之间有确认消息。因此,两个用户可以选择员工,得到确认消息(此时双方都被告知有足够的空间),导致比预期更多的人加入到会话中。幸运的是,如果两个用户都试图将相同的雇员插入到该表中,其中一个将得到一个重复的错误,但是如果员工不同,则会进行插入。
在另一个DB引擎(如SQL server )上,我将使用一个存储过程来锁定表,进行检查和插入,然后解锁表。
但在MS Access中,这似乎是不可能的。在MS访问中,有什么可能防止会话有超过最大数量的参与者?任何帮助都是非常感谢的。
发布于 2014-10-31 11:40:48
完成目标的一种方法是在事务中执行INSERT,计算该会话的参与者,如果新的总数超过限制,则回滚事务:
Option Compare Database
Option Explicit
Sub AddParticipant()
Dim cdb As DAO.Database, cws As DAO.Workspace, _
qdf As DAO.QueryDef, rst As DAO.Recordset
' test data
Const idPersonnelToAdd = 4
Const idSessionToAdd = 2
Set cdb = CurrentDb
Set cws = DBEngine.Workspaces(0)
cws.BeginTrans
Set qdf = cdb.CreateQueryDef("", _
"PARAMETERS prmIdPersonnel Long, prmIdSession Long; " & _
"INSERT INTO Inscriptions (idPersonnel, idSession) " & _
"VALUES (prmIdPersonnel, prmIdSession)")
qdf!prmIdPersonnel = idPersonnelToAdd
qdf!prmIdSession = idSessionToAdd
qdf.Execute dbFailOnError
Set qdf = Nothing
Set qdf = cdb.CreateQueryDef("", _
"PARAMETERS prmIdSession Long; " & _
"SELECT " & _
"Count(*) AS NumParticipants, " & _
"First(MaxParticipants) AS Limit " & _
"FROM Inscriptions INNER JOIN Sessions " & _
"ON Inscriptions.idSession = Sessions.idSession " & _
"WHERE Sessions.idSession = prmIdSession")
qdf!prmIdSession = idSessionToAdd
Set rst = qdf.OpenRecordset(dbOpenSnapshot)
If rst!NumParticipants <= rst!Limit Then
cws.CommitTrans
Debug.Print "INSERT committed"
Else
cws.Rollback
Debug.Print "INSERT rolled back"
End If
rst.Close
Set rst = Nothing
Set qdf = Nothing
Set cws = Nothing
Set cdb = Nothing
End Subhttps://stackoverflow.com/questions/26671565
复制相似问题