ms-access – 检测访问绑定表单上是否删除了当前记录

如果用户#1删除Access 2007数据库(sql Server ODBC链接表)中的记录,则其他用户可能会在该记录中显示#Deleted#(在数据表视图表单上).在某些情况下,这可能会导致问题,因为我的代码在Form的当前事件上运行,并且只是假设存在有效记录(或新记录).

有没有可靠的方法来检测当前记录是否已被删除?我想把它包装在这样的函数中:

Public Function IsRecordDeleted(ByRef r As DAO.Recordset)
   'what goes here?
End Function

我确实在MSDN的DAO引用中找到了RecordStatus属性,但该属性似乎仅在RecordSet配置为批量更新时才有效.当我尝试检查它的值时,我得到:运行时错误3251 – 此类对象不支持操作.

我实际上在一两年前在另一个论坛上发布了同样的问题.给出的建议不起作用:

> DCount()
>记录集的书签和NoMatch
>在PK或FK字段中检查#Deleted

解决方法

对我来说,这看起来更像是一般的应用程序设计疏忽,而不是一个简单的解决方案.

如果您对重要位置的记录可用性进行假设,则必须考虑删除记录作为数据主要(和有效)状态的可能性.

这是可能的 – 但我认为不太可能 – 你会找到一个解决方法,但我认为你应该仔细看看你的整体设计本身.

解决问题的一些方法,根据您的数据如何被用户包含和访问,可能会或可能没有用处:

>如果你不能确定它们会在那里,那么就不要依赖于记录的存在.
基本上,重做您的假设并修改现有代码,以避免依赖于强制存在的记录.
>责任分离
不允许不同的用户对相同的数据具有相同的创建/编辑/删除权限.例如,采购订单应属于创建订单的用户.不允许其他用户单独删除该订单或其项目.
>实际上不要删除实体,只是允许用户将其标记为“已取消”或“已过时”,并将其保存在数据库中以用于历史原因(或稍后清除它们).
>或者,实际上不删除记录,但添加隐藏的布尔字段以在用户想要删除它们时将其标记为“已删除”.然后你可以做一些清理工作,比如每晚,然后删除标记的记录.
当然,您必须从查询和表单等中排除这些“已删除”记录,但会保留数据完整性.
>将报告和记录列表设置为只读,这样用户就不能在任何地方删除它们.例如,如果用户可以查看采购订单项目,则不允许他们删除该数据,除非他们实际打开采购订单详细信息表单.
>在本地缓存记录,这样如果它们从后端数据库中消失,它们仍会向用户显示,直到刷新列表为止.
这对于只读报告通常很有用:将查询结果加载到本地表中,并使用实时数据绑定该表而不是查询.
正在查看的数据可能会稍微陈旧,因为它不会实时更新(因为它在本地缓存)但是对于报告,通常都可以(只需在表单上提供“刷新”按钮以允许用户强制刷新) .
>尝试使用各种锁定选项(请参阅database optionsform record locking),以禁止在其他人访问记录时删除记录.
>管理自己的锁定方案.
作为最后的手段,您可以在“LockingStatus”表中记录当前正由其他人查看或编辑的ID和记录.例如:

Table: LockStatus
Field: LockNature:   Whether the record is being Edited or Viewed
Field: LockedTable:  Name of the table of the record being locked
Field: LockedRecord: ID of the record being locked
Field: User:         Name of the user holding the lock
Field: LockTime:     DateTime of the lock creation,so you can detect 
                     and remove stale locks

用户查看或编辑记录时,首先检查表中是否存在该记录的现有条目.如果有,则告诉用户他们无法执行操作,因为其他人正在查看数据.如果没有现有条目,请在编辑完成后添加一个,允许编辑并删除记录.
这充满了复杂性,因为您需要跟踪用户何时移动到另一个记录,以便您可以解锁前一个记录,如果您不小心,您可能会遇到大量陈旧锁定,但之前已经完成.
>如果您仍然想要绕过已删除的记录问题,请查看在您的VBA代码中,当您从其他位置删除记录时,会出现错误3167“记录已删除”.
一旦你知道它在你的代码中出现的位置,使用On Error 3167捕获该错误就可以优雅地处理该特定错误(这实际上取决于表单的设计方式以及如何使用数据).
>另一种方法是使用全局错误处理程序进行访问.
我只知道vbWatchdog.它不是免费的,但它工作得非常好,并且很容易集成到应用程序中.此加载项集成在您的应用程序中,无需为每个用户单独安装.设置完成后,您的应用程序将能够捕获高级别的所有错误.因此,您将能够捕获“记录已删除错误并在一个地方处理它们.

相关文章

vue阻止冒泡事件 阻止点击事件的执行 <div @click=&a...
尝试过使用网友说的API接口获取 找到的都是失效了 暂时就使用...
后台我拿的数据是这样的格式: [ {id:1 , parentId: 0, name:...
JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简...
Mip是什么意思以及作用有哪些