1

在我正在编写的应用程序中,当我使用 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 数据库中 - 因此是标签。

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

我尝试注释掉所有对象值更改,只留下可见、锁定和启用的更改 - 但我不断收到写入冲突。我尝试将 Me.Dirty = False 放在事件过程的末尾,甚至尝试将其删除。到目前为止,每当我更改“要求定价”或“允许空白定价”时,我都会遇到写入冲突,而 VBA 代码不会更改其他值。

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

一旦创建记录,这些复选框操作的字段将不接受任何更改,每当我尝试使用它们时都会产生写入冲突。现在我完全糊涂了,想把所有东西都毁掉,然后重新开始。

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

经过调查,似乎在服务器上为所涉及的表定义了许多我无法删除的检查约束。即使项目没有更改,某些东西也会导致链接表总是报告脏表——我认为 Access 和 SQL 正在使用默认值来解决这个问题。我将擦除所有表,删除所有信息,然后重新开始我的设计,因为检查约束似乎不能在不删除表的情况下删除。谢谢大家的帮助,这个问题可以关闭吗 - 将问题提交给这个新问题(不允许更新记录 - 写入冲突)?

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

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

4

3 回答 3

1

几点评论:

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

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

  • 与其将特定代码放入每个事件中,不如将所有内容重新组合到同一个,例如,Update()从每个事件处理程序调用的 sub 中。
    它将使您更容易管理代码及其副作用,因为它是一直被调用的同一段代码。

  • 话虽如此,你的代码应该可以工作,所以我猜这个问题来自你代码中的其他地方。
    如果同一记录已在其他地方打开以进行编辑,则会发生写入冲突。
    您可以尝试使用锁定类型,看看它是否会改变任何东西。

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

于 2009-05-29T07:40:39.347 回答
0

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

于 2009-05-28T19:43:47.420 回答
0

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

于 2009-06-29T19:09:54.883 回答