我有一个Access数据库前端,我试图在表单上放一个按钮来删除当前记录。我使用以下VBA代码删除记录:
If Me.NewRecord Then
Me.Undo
Exit Sub
End If
DoCmd.RunCommand acCmdDeleteRecord
Me.Requery
Me.Refresh
当我在使用表单插入数据库的记录上运行此操作时,它会在DoCmd上返回运行时错误“2501”。但是,如果我在数据库中已经存在的记录上运行它,那么代码将按预期完成。
此外,还没有其他人正在访问此数据库表,我只打开了一个表单。
当我在访问中手动从链接表中删除它时,我得到了同样的错误,但是我能够使用SQL Server Management Studio从数据库中删除它们。
会导致这种情况发生的原因是什么?
修改
我做了一些调查,发现我无法使用访问权限在基表中编辑新记录。我收到有关其他用户更改的记录的错误。
答案 0 :(得分:1)
除了建议在表中添加一个时间戳字段(SSMA助手将它添加到所有表格,当你使用它来从Access升级时,这肯定是我推荐的),我对你的代码有一些批评。我会这样写的:
If Me.NewRecord Then
Me.Undo
Else
DoCmd.RunCommand acCmdDeleteRecord
Me.Requery
End If
重新查询后刷新是多余的,因为您已经拥有最新数据。
使用Exit Sub对于不相互排斥的事物的保护条款很有帮助,但在这种情况下,您有/或 - 要么删除现有记录要么撤消新记录。这可以在单个If / Then / Else块中处理,然后您的子例程有一个退出点,这对于将来代码变得更加复杂非常有用。
答案 1 :(得分:0)
这不是您的特定问题的答案,但是关于获得Error 2501 while trying to delete a record
的问题标题,发生这种情况的另一种情况是
您尝试删除一个表中的行,而该行将孤立另一个表中的行 表(因为这两个表是通过外键链接的)。的SQL 服务器拒绝删除,并且Access返回该模糊的2501错误 代码。
对于我来说,我通过使用ON DELETE CASCADE
删除并重新创建每个外键来解决了该问题,因此当通过Access删除“主”表中的一行时,SQL Server会自动删除每个外键中的相应行。 “详细信息”表。
有关级联删除的更多详细信息,请参见以下问题: