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

Chr*_*ell 15 sql ms-access linked-tables

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

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

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

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

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

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

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

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

绝对没有DB上的其他用户."其他用户"可能是我被迫保存的.

有任何想法吗?

Ist*_*ari 44

看一下SQL Server 2000中的链表.它是否有一个包含bit数据类型的字段?如果您的位字段没有默认值, Access将在链接表方案中为您提供此错误消息.

它可能不是你的情况下的错误,但我在Access 2007数据库中遇到了相同的问题,并将问题跟踪到没有默认值的位字段.

  • 这完全适合我,我将空位列更新为零,错误消失了. (3认同)
  • 请记住确保位字段不能设置为空,否则您将不得不接受比尔格的答案。 (2认同)

Bir*_*ger 10

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

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


Dav*_*ton 7

您通常会遇到以下错误:

  1. 您正在编辑表单中的记录并且表单是脏的(即,编辑未保存),

  1. 您运行使用DAO或ADO运行SQL以更新相同记录的代码.

对Jet来说,这是两个"用户",因为它是两个不同的编辑操作.SQL更新已更新基础表,而表单缓冲区中的数据现已过期.

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

  If Me.Dirty Then
     Me.Dirty = False
  End If
  [run your SQL update here]
Run Code Online (Sandbox Code Playgroud)

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

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

  1. 用户点击NEW RECORD按钮.

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

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

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

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

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

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


vol*_*ron 5

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

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

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