什么可能导致零星的" -2147352567数据已被更改"错误?

时间:2015-12-08 12:45:38

标签: ms-access ms-access-2010

我们的一种表单偶尔会生成此错误消息。问题发生在我们的订单表单上,该表单绑定到链接的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

1 个答案:

答案 0 :(得分:0)

@iDevelop实际上促使我考虑在表格中添加一个时间戳,所以我只接受部分功劳;)...

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

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

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

  

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

     

Office Access无法可靠地检查匹配值的数据类型。这些包括大对象类型,例如文本 ntext 图像 varchar(max),< SQL Server 2005中引入的strong> nvarchar(max)和 varbinary(max)类型。此外,还有浮点数字类型,例如 real 浮动会受到可能导致比较不精确的舍入问题的影响,导致在值未真正更改时取消更新。 Office Access也无法更新包含没有默认值且包含空值的位列的表。

     

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

     

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