微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.它不是免费的,但它工作得非常好,并且很容易集成到应用程序中.此加载项集成在您的应用程序中,无需为每个用户单独安装.设置完成后,您的应用程序将能够捕获高级别的所有错误.因此,您将能够捕获“记录已删除错误并在一个地方处理它们.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐