MS-ACCESS 写入冲突问题

Posted

技术标签:

【中文标题】MS-ACCESS 写入冲突问题【英文标题】:MS-ACCESS Write Conflict Issue 【发布时间】:2019-11-19 16:32:02 【问题描述】:

我遇到了写入冲突问题。不知道可能是什么原因。当多个用户使用 Access 数据库时会出现此问题。

下面是正在发生的事情的示意图。 (Main) Form 显示 Subform(其中一些数据显示来自 Table)。用户可以通过弹出的(Details) Form 双击一个名称以调出该个人的详细信息。如果进行了更改,用户可以保存详细信息(实际上,在关闭窗口时会弹出一个提示询问您是否要保存)。

保存时,再打开另一个人的详细信息,会弹出写冲突。

关闭(Details) Form时的代码:

Private Sub Form_BeforeUpdate(Cancel As Integer)

   ' This procedure checks to see if the data on the form has
   ' changed. If the data has changed, the procedure prompts the
   ' user to continue with the save operation or to cancel it. Then
   ' the action that triggered the BeforeUpdate event is completed.

   Dim ctl As Control

   On Error GoTo Err_BeforeUpdate

   ' The Dirty property is True if the record has been changed.
   If Me.Dirty Then
      ' Prompt to confirm the save operation.
      If MsgBox("Do you want to save?", vbYesNo + vbQuestion, _
              "Save Record") = vbNo Then
         Me.Undo
      End If
   End If

Exit_BeforeUpdate:
   Exit Sub

Err_BeforeUpdate:
   MsgBox Err.Number & " " & Err.Description
   Resume Exit_BeforeUpdate
End Sub

取自微软网站(我认为)。

我的数据结构是否有问题导致此问题?

如果需要更多信息,我可以编辑帖子以包含更多代码等。

编辑 1:反转 Subform 箭头。 Subform 只显示来自Table 的数据。

编辑 2:后端是 Access。从Subform打开(Details) Form

Private Sub First_Name_DblClick(Cancel As Integer)

DoCmd.OpenForm "Details", , , "[First Name] = '" & Me![First Name] & "' and [Last Name] = '" & Me![Last Name] & "'"

End Sub

编辑 3:

查看(Main) Form 时,Subform 的源对象设置为Subform 的名称,我称之为QuerySFQuerySF 表单将Record Source 设置为Table。弹出窗口(Details) Form 的记录源设置为Table。我可以改为将 (Details) Form 的记录源设置为我的查询,但我尝试了这个并没有帮助。

在某处插入Requery 会有帮助吗?

我注意到每三次通过子表单打开(Details) Form 时会出现一次弹出窗口。

【问题讨论】:

用户可以对主子窗体上的数据进行修改吗? 你的后端是什么?访问、服务器还是全部都在一个数据库中? -- 通常如果你通过VBA修改数据并且之后不重新查询表单就会弹出这个错误。 另外,然后要打开另一个人的详细信息的代码是什么? 我无法复制此问题。禁用错误处理程序和单步调试。也许需要发布保存按钮代码。为什么不使用 ID 而不是名称? 正如 June7 所写的,这里没有任何东西可以解释这种行为。我的赌注仍然是在此过程中运行的 一些 代码(例如,在打开详细信息表单时)。甚至可能是数据宏之类的。 【参考方案1】:

如果您不想保存,请使用Cancel = True。如果表单不脏,BeforeUpdate 不会触发,所以不要打扰If Me.Dirty

 ' Prompt to confirm the save operation.
 If MsgBox("Do you want to save?", vbYesNo + vbQuestion, "Save Record") = vbNo Then
     Cancel = True
     Me.Undo
 End If

【讨论】:

问题出在数据何时保存。保存后(比如更改复选框或其他内容),然后打开另一个人,会弹出写入错误。当我不保存时,不会发生这种情况。另外,关闭窗口时会提示保存(没有保存按钮,但我想过程是一样的)。 我仍然无法复制问题。无论是否保存,代码对我来说都是完美的。关闭表单时没有保存提示。我可以打开另一个记录的弹出窗口。错误处理程序实际上会干扰调试。禁用然后设置断点和单步调试。我怀疑子表单上的记录以某种方式进入编辑模式,这会导致与弹出表单上的相同记录发生写入冲突。子表单 SourceObject 和 popup 是两个不同的表单对象? 子表单有一个 Source Object = 到子表单,这取决于Table(Details) Form 记录源是 Table。保存代码工作正常,我认为我的设置似乎有些不稳定。 这并不能真正确认有两个不同的表单对象用于子表单和弹出窗口。 SourceObject 属性中的对象名称是什么,弹出表单的名称是什么?编辑问题以显示示例数据和关系。 我已经解决了这个问题。老实说,我改变了一些设置,然后又改回来,一切都恢复了。很奇怪!但我接受了你的回答,因为我确实觉得它很有用。

以上是关于MS-ACCESS 写入冲突问题的主要内容,如果未能解决你的问题,请参考以下文章

Access使用链接表写入冲突问题

使用 SQL Server 在 Access 中写入冲突

在 Access VBA 中禁止写入冲突消息

ms-access:双链表

经典 ASP 和 ms-access:插入数据的问题

ms-access 2007 年报告