首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当插入数据时Ms访问锁表

当插入数据时Ms访问锁表
EN

Stack Overflow用户
提问于 2014-10-31 09:44:10
回答 1查看 2.7K关注 0票数 1

在Access 2003数据库中,我在idPersonnel (employee)和idSession两个字段上有一个带有主键的“铭文”(订阅)数据库。我已经做了一个表单,这样用户就可以选择一个会话(在列表框中),然后选择一个或多个员工(另一个列表框),然后使用一个按钮将它们输入到该会话中,该按钮在VBA端首先检查会话上是否有足够的空间(由"MaxParticipants“字段定义,链接到idSession上的”铭文“表),然后在”铭文“表中插入数据。

这在单用户环境中运行良好,但如果两个人希望同时在同一会话中加入一些员工,则会失败,因为我在检查和插入之间有确认消息。因此,两个用户可以选择员工,得到确认消息(此时双方都被告知有足够的空间),导致比预期更多的人加入到会话中。幸运的是,如果两个用户都试图将相同的雇员插入到该表中,其中一个将得到一个重复的错误,但是如果员工不同,则会进行插入。

在另一个DB引擎(如SQL server )上,我将使用一个存储过程来锁定表,进行检查和插入,然后解锁表。

但在MS Access中,这似乎是不可能的。在MS访问中,有什么可能防止会话有超过最大数量的参与者?任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-31 11:40:48

完成目标的一种方法是在事务中执行INSERT,计算该会话的参与者,如果新的总数超过限制,则回滚事务:

代码语言:javascript
复制
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 Sub
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26671565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档