【问题标题】:Write Conflicts - even with me.dirty写冲突——即使是我。脏
【发布时间】:2010-10-29 16:36:03
【问题描述】:

在我正在编写的应用程序中,当我使用 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 放在事件过程的末尾,甚至尝试将其删除。到目前为止,每当我更改 Require Pricing 或 Allow Blank Pricing 时,我都会遇到写入冲突,而 VBA 代码不会更改其他值。

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

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

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

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

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

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

【问题讨论】:

  • 写冲突是什么意思?如果没有这段代码,它会按您的预期工作吗?
  • 如果没有此代码,无论何时更改空白定价或要求定价的值 - 在编辑一个后立即出现一个写入冲突对话框(导致另一个字段被 VBA 代码更改)强制将更改写入剪贴板,或删除更改。

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


【解决方案1】:

几个cmets:

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

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

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

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

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

【讨论】:

  • 我尝试编辑查询所基于的直表,表单所基于的表格是整个事情的开始。尽管允许在表单上进行编辑,但它不会让我编辑已输入记录的值。我得到相同的写入冲突对话框,除非我登录到服务器并直接从 Server Management Studio 控制台中输入值。
  • 你的意思是一旦底层原始表绑定到表单就不能编辑数据了?你遇到了什么错误?您是否尝试从 SQL Server 获取表及其数据以驻留在本地 Access 数据库中?你还在收到这些错误吗?如果不看整个事情,就很难找到问题的答案。也许查询太复杂了,它变成了只读的。不幸的是,问题似乎并不在于您在此处提供的内容,因此很难猜测。
  • 基本上,我尝试将数据输入到原始表单所基于的查询的数据表视图中 - 但我仍然遇到写入冲突。我转到生成查询的 Access 应用程序中的链接表,当我尝试更改现有值时,它也给了我一个写入冲突。接受数据的唯一方法是,如果我直接进入 SQL Server 的管理控制台,执行“编辑前 100 条记录”并在那里输入数据。然后它会更新。
【解决方案2】:

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

【讨论】:

  • 此表单所基于的查询所引用的所有表都有主键 - 所以我认为我的问题和你的问题不相关(虽然可能是错误的)。
  • 他们有时间戳吗?时间戳有助于 Access 刷新数据。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多