尝试删除记录时出错2501

时间:2011-01-10 19:27:21

标签: sql-server-2008 ms-access-2007

我有一个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从数据库中删除它们。

会导致这种情况发生的原因是什么?

修改

我做了一些调查,发现我无法使用访问权限在基表中编辑新记录。我收到有关其他用户更改的记录的错误。

2 个答案:

答案 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会自动删除每个外键中的相应行。 “详细信息”表。

有关级联删除的更多详细信息,请参见以下问题: