【问题标题】:What can cause a sporadic "-2147352567 The data has been changed" error?什么会导致零星的“-2147352567 数据已更改”错误?
【发布时间】:2015-12-08 12:45:37
【问题描述】:

我们的一个表单不断地偶尔生成此错误消息。该问题出现在我们的订单表单上,该表单绑定到一个链接的 SQL Server 2008 表。打印通知单(使用报告)后,订单状态设置为“已打印订单”。此时,我偶尔会看到“-2147352567 数据已更改”错误。我会说 95% 的情况下,这不会发生,但正是另外 5% 的情况让我们头疼(以及无数的支持电话)。

奇怪的是,关闭表单并尝试对订单执行相同操作会导致相同的错误消息,但关闭数据库并再次尝试可以正常工作。

就好像表单绑定的表/记录有一些未提交的更改,即使没有打开任何表单、报告等也存在。

代码如下所示:

Select Case Me.txtCurrentStatus
  Case NEW_ORDER, UNPRINTED_ORDER:
    Me.txtCurrentStatus = PRINTED_ORDER
End Select
'Commit changes
If Me.Dirty = True Then Me.Dirty = False

【问题讨论】:

  • 在打印前保存,至少看看是否有影响?什么是后端? Jet/ACE 还是 SQL Server?你的桌子有PK吗?
  • 嗨 iDevelop。后端是 Microsoft SQL Server 2008 SP3,我们使用 SQL Server Native Client 11.0 进行连接。是的,该表有一个主键。该问题仅每 20 个订单发生一次...我无法辨别任何特定模式或问题发生的原因。似乎完全随机。
  • 您与之交互的桌子上有触发器吗?
  • 您的表格是否包含时间戳字段?如果没有,添加它(并重新链接表)
  • Brad - 是的,桌子上有一个删除触发器......但我没有删除任何东西。

标签: ms-access ms-access-2010


【解决方案1】:

@iDevelop 实际上促使我考虑在表格中添加时间戳,因此我只获得部分功劳;)...

简而言之 - 在 Microsoft Access 中使用链接表时,如果表不包含 timestamp 类型的列,Access 将比较表中的每一列,以查看自记录被检索。 Access 无法可靠地检查几种数据类型(请参阅下面的文章)。只需添加 timestamp 类型的列即可更改此行为,而 Access 仅检查 rowversion 是否已更改...这使此检查更加可靠并提高了性能.

奇怪的是,这根本不是真正的时间戳 - 它是一个行版本,但在我使用的 SQL Server 2008 中,行版本不能通过 GUI 获得。

https://technet.microsoft.com/en-us/library/bb188204%28v=sql.90%29.aspx

Office Access 链接表中可更新性问题的主要原因可能是 Office Access 无法验证服务器上的数据是否与正在更新的动态集上次检索到的数据相匹配。如果 Office Access 无法执行此验证,则假定服务器行已被其他用户修改或删除,并中止更新。

Office Access 无法可靠地检查几种类型的数据是否匹配值。其中包括大型对象类型,例如 textntextimagevarchar(max)、nvarchar(max) 和 varbinary(max) 类型。此外,浮点数值类型,例如 realfloat,可能会导致比较不精确的舍入问题,从而导致在值没有真正改变时取消更新。 Office Access 在更新包含没有默认值且包含空值的位列的表时也会遇到问题。

解决这些问题的一种快速简便的方法是在 SQL Server 上的表中添加 timestamp 列。 时间戳列中的数据与日期或时间完全无关。相反,它是一个二进制值,保证在整个数据库中是唯一的,并且每次将新值分配给表中的任何列时都会自动增加。此类列的 ANSI 标准术语是 rowversion。 SQL Server 支持该术语。

Office Access 会自动检测表何时包含此类列,并在影响该表的所有 UPDATEDELETE 语句的 WHERE 子句中使用它。这比验证所有其他列是否仍然具有与上次刷新动态集时相同的值更有效。

【讨论】:

  • 在您最初的问题中,您忽略了您正在使用服务器数据库的巨大事实。使用文件共享后端 (JET/ACE) 时,行版本逻辑不适用。
  • 嗨,阿尔伯特。完全正确......我将把它添加到问题中,这样对于那些试图把头撞在砖墙上试图解决这个问题的人来说,这更有意义。现在整整2天没有问题! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 2019-01-22
  • 2021-01-10
  • 2019-01-26
  • 1970-01-01
相关资源
最近更新 更多