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
的名称,我称之为QuerySF
。 QuerySF
表单将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 写入冲突问题的主要内容,如果未能解决你的问题,请参考以下文章