写冲突 - 即使是我

时间:2009-05-28 19:17:22

标签: sql-server ms-access vba null default-value

在我正在编写的应用程序中,当我使用VBA代码更改表单上复选框的值时,我收到了写冲突。我已经尝试将以下代码插入到VBA更改表单上任何对象的值的事件中:

If Me.Dirty Then
    Me.Dirty = False
End If

但问题仍然存在 - 好像在我想通过手动操作改变任何东西之前没有保存记录。

以下是我遇到此问题的表单中的完整代码的一些示例:

更改空白定价复选框时的代码:

Private Sub chkSupAllowBlankPrice_AfterUpdate()

    If Me.Dirty Then
        Me.Dirty = False
    End If

    If (chkSupAllowBlankPrice.Value = True) Then
        chkSupRequirePrice.Value = False
    End If
End Sub

需要定价时的代码复选框:

Private Sub chkSupRequirePrice_AfterUpdate()
    If Me.Dirty Then
        Me.Dirty = False
    End If

    If (chkSupRequirePrice.Value = True) Then
        chkSupAllowBlankPrice.Value = False
        chkSupAllowBlankPrice.Visible = False
        chkSupAllowBlankPrice.Enabled = False
        chkSupAllowBlankPrice.Locked = True
        lblSupAllowBlankPrice.Visible = False
    Else
        chkSupAllowBlankPrice.Visible = True
        chkSupAllowBlankPrice.Enabled = True
        chkSupAllowBlankPrice.Locked = False
        lblSupAllowBlankPrice.Visible = True
    End If
End Sub

不确定它是否有帮助,但表存储在SQL Server Express数据库中 - 因此标记。

- 编辑于05/29/2009 @ 1201小时 -

我已尝试将所有对象值更改注释掉,只留下可见,锁定和启用的更改 - 但我不断遇到写入冲突。我尝试在事件过程结束时输入Me.Dirty = False,我甚至尝试将其删除。到目前为止,每当我更改Require Pricing或Allow Blank Pricing时,我都会收到写入冲突,而VBA代码不会更改其他值。

- 2009年5月29日编辑@ 1318小时 -

这些复选框操作的字段 - 不会 - 在创建记录后接受任何更改,并在我尝试使用它们时生成写入冲突。现在我完全糊涂了,想着把一切都搞砸了,重新开始。

- 编辑于06/01/2009 @ 1209小时 -

经过调查,似乎服务器上为所涉及的表定义了许多检查约束,我无法删除。有些事情导致链接表总是报告脏,即使项目没有被更改 - 我认为Access和SQL正在使用默认值来解决它。我将擦除所有表格,删除所有信息,然后重新开始我的设计,因为检查约束似乎无法移除而不会丢弃表格。感谢大家的帮助,可以关闭这个问题 - 将问题引用到这个新问题(Updates to Records not allowed - Write Conflict)?

- 编辑于06/03/2009 @ 1307小时 -

从其他问题交叉发布,下面描述了解决所有奇怪的解决方案。感谢所有与我一起开拓此事的人,我真的很有帮助。我发现使用Yes / No复选框和带有Access的SQL Server时会出现一个奇怪的问题。显然,Access会将NULL解释为否 - 更改值,但SQL Server不会将NULL解释为位字段中的“否”(转换中的“是/否”),因此当值不是时会抛出“写入冲突”错误必需,并且为NULL。解决方案是重新设计表,以便需要一个值,并为每个以前的Yes / No复选框分配一个默认值。这解决了神秘的Write Conflict消息,并允许在创建记录后对记录进行更改。

3 个答案:

答案 0 :(得分:1)

一些评论:

  • 在更改其他字段的值之前保存表单的数据(设置Dirty=false)是否有任何特殊原因(这会使表单再次变脏)?
    我首先要更改其他字段的数据然后保存表单的数据,否则表单总是很脏

  • 从代码更改控件的值不会调用他们的事件,因此从chkSupRequirePrice更改chkSupAllowBlankPrice_AfterUpdate()的值不会调用chkSupRequirePrice_AfterUpdate()

  • 不要将特定代码放入每个事件中,最好将所有内容重组为相同的,例如,从每个事件处理程序调用的Update()子。 它将使您更容易管理代码及其副作用,因为它是始终调用的相同代码段。

  • 话虽如此,您的代码应该正常工作,所以我猜测问题来自代码中的其他地方。
    如果已经打开相同的记录以便在别处进行编辑,则会发生写入冲突 您可以使用锁定类型,看看它是否有任何改变。

  • 要查看问题是否与您的SQL Server设置确实相关,请尝试取消链接表,然后将其复制到本地Access数据库,以查看在处理本地Access时是否仍然遇到此问题表

答案 1 :(得分:0)

过去,如果SQL Server链接表没有主键,我在Access中遇到了一些奇怪的问题。如果您的表没有主键,则它不知道要更新哪个记录。我知道我曾经收到类似的消息,但是几年前,我不知道这是不是你的问题。

答案 2 :(得分:0)

Access如何处理是/否复选框值与SQL Server之间存在差异。将Access / No布尔值从Access转换为SQL Server时,您必须记住定义默认状态并将其标记为需要答案。否则,每次都会出现写入冲突,并且一旦设置了初始值,就会阻止记录与您的更改一起保存。