链接访问数据库“记录已被其他用户更改”

时间:2009-06-09 23:54:00

标签: sql ms-access linked-tables

我正在维护一个链接到MSSQL2000数据库的多用户Access 2000 DB,而不是我写的。

数据库设计很差,所以你必须忍受我。

在“客户”表单上有一个“Customer_ID”字段,默认情况下需要获取下一个可用的客户ID,但用户可以选择使用现有客户ID覆盖此选项。

现在,Customer_ID字段不是Customer表的PK。它也不是唯一的。

如果客户拨打两次提交作业,该表将获得两条记录,每条记录具有相同的客户信息和相同的客户ID。

如果用户创建新票证,Access会快速查找下一个可用的客户ID并将其填入。但它不会保存记录。显然是一个问题 - 两个用户编辑必须跟踪彼此的工作,这样他们就不会欺骗客户ID。

所以我想修改“新记录”按钮,以便在创建新票据后立即保存票证。

问题是,当我测试更改时,我得到“此记录已被其他用户更改,因为您开始编辑它”。

数据库上肯定没有其他用户。 “其他用户”可能是我被迫保存的。

有什么想法吗?

10 个答案:

答案 0 :(得分:43)

查看SQL Server 2000中的链接表。是否有包含bit数据类型的字段?如果您的位字段没有默认值,Access将在链接表方案中显示此错误消息。

在您的情况下可能没有什么问题,但我在Access 2007数据库中遇到了相同的问题,并将问题跟踪到没有默认值的位字段。

答案 1 :(得分:9)

之前我已经看过这种行为,并为我解决了这个问题:

尝试向表中添加TimeStamp字段(只需添加此字段并更新链接表。您无需使用任何类型的数据填充此字段)。

答案 2 :(得分:7)

您遇到的错误通常发生在:

  1. 您正在编辑表单中的记录,表单很脏(即编辑未保存),
    1. 您运行使用DAO或ADO运行SQL以更新相同记录的代码。
    2. To Jet,这是两个“用户”,因为它是两个不同的编辑操作。 SQL更新已更新基础表,而表单缓冲区中的数据现已过期。

      通常的解决方案是在运行SQL更新之前强制保存:

        If Me.Dirty Then
           Me.Dirty = False
        End If
        [run your SQL update here]
      

      但是如果您使用表单来编辑记录,则应该在表单中进行所有更新,而不是使用SQL来进行更新。

      您描述的生成自己序列的情况应该以这种方式完成:

      1. 用户点击NEW RECORD按钮。

      2. 计算下一个序列值并将其存储在变量中。

      3. 通过SQL INSERT插入带有该序列值的新记录。

      4. 4A。如果您的表单绑定到表中的所有记录,请重新查询数据编辑表单(假设NEW RECORD按钮位于用户编辑数据的表单上),并使用书签导航移动到具有序列值的新记录你在步骤2中存储了变量。

        4b中。如果您的表单绑定到所有记录(因为它不应该是一个设计良好的数据库),您只需更改表单的记录源以仅加载新记录。 / p>

        另一种方法是避免SQL INSERT和重新查询(或重置记录源),只需在现有表单中添加新记录,将序列字段设置为新值并立即保存记录。

        关键在于,要在多用户环境中工作,必须在为序列值分配时立即保存记录 - 您不能将记录挂在那里未保存,因为这意味着其他用户可以使用相同的序列值,这只是一场灾难。

答案 3 :(得分:5)

这是一个老问题,我从谷歌那里得到了,所以我会提交答案。

在ODBC驱动程序中,确保打开行版本控制。如果该表已在Access中,则必须将其删除并重新链接到源表。

您应该能够判断是否启用了行版本控制,因为Access应该在您的表中添加一个名为xmin的列。

答案 4 :(得分:1)

我会跟踪用户是否已使用自己的值覆盖新的customer_id。如果他们没有,那么您的应用应该能够在保存之前检查重复权限并且再次自我增量,并且用户不介意采用默认值。甚至可能会向用户指示您必须自动选择不同的值。

答案 5 :(得分:0)

我也有同样的问题。我试图使用Spring MVC和hibernate在表中进行更新。在我的情况下,表中的版本列包含一个大于1的值(即3),但是我的更新查询中的更新信息的版本值为1.

答案 6 :(得分:0)

我们的问题是访问前端试图将int(是/否)保存到mssql位(0/1)字段中。将mssql数据库更改为int字段就像魅力一样。

答案 7 :(得分:0)

我刚刚遇到另一种产生此错误的情况。在一个mysql表中,我有两个日期列,最初默认值为'0000-00-00'。后来它被改为默认NULL但很多行都保留了值'0000-00-00'。我不得不手动将值重置为NULL以停止错误。

花了很多时间才弄明白错误是什么,HTH是其他人。

答案 8 :(得分:0)

如果SQL Server表包含datetime2列(在我的情况下使用默认值sysdatetime()),也会抛出此错误。将数据类型更改回日期时间默认current_timestamp会停止错误。

答案 9 :(得分:0)

我已经在本文和其他一些文章中来回寻找解决此问题的方法。我有一个链接到MySQL数据库的MS Access数据库。该问题是由MySQL phpmyadmin中现有的BeforeUpdate触发器引起的。在phpmyadmin中,转到表的结构,然后在屏幕底部看到触发器。