19

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

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

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

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

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

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

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

问题是,当我测试更改时,我得到“自从您开始编辑此记录以来,其他用户已更改此记录”。

数据库上绝对没有其他用户。“其他用户”大概是我的强制保存。

有任何想法吗?

4

10 回答 10

52

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

在您的情况下,这可能不是问题,但我在 Access 2007 数据库中遇到过同样的问题,并将问题跟踪到没有默认值的位字段。

于 2009-06-11T18:12:25.373 回答
15

我以前见过这种行为,这为我解决了这个问题:

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

于 2009-06-10T13:44:22.730 回答
7

您遇到的错误通常发生在以下情况:

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

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

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

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

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

但是如果你使用表单来编辑记录,你应该在表单中做所有的更新,而不是求助于 SQL 来做更新。

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

  1. 用户点击新记录按钮。

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

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

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

4b。如果您的表单绑定到所有记录(如果它是一个精心设计的数据库,则不应该如此),您只需更改表单的记录源以仅加载新记录。

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

关键是要在多用户环境中工作,必须在为它分配序列值后立即保存记录——你不能让记录挂在那里不保存,因为这意味着其他用户可以使用相同的序列值,这只是要求灾难。

于 2009-06-10T03:45:28.067 回答
5

这是我从谷歌遇到的一个老问题,所以我将提交我的答案。

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

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

于 2011-03-28T14:01:08.637 回答
1

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

于 2009-06-10T00:08:24.767 回答
1

我一直在这篇文章和其他一些文章中来回寻找解决这种行为的方法。我有一个链接到 MySQL 数据库的 MS Access 数据库。该问题是由 MySQL phpmyadmin 中现有的更新前触发器引起的。在 phpmyadmin 中转到表结构,在屏幕底部您会看到触发器。

于 2019-12-06T14:14:58.953 回答
0

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

于 2013-06-18T11:19:45.687 回答
0

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

于 2014-03-17T18:19:03.173 回答
0

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

花了很多时间来弄清楚是什么引发了错误,HTH 别人。

于 2015-01-27T20:12:03.293 回答
0

如果 SQL Server 表包含 datetime2 列(在我的例子中,默认值为 sysdatetime()),也会引发此错误。将数据类型更改回 datetime 默认 current_timestamp 会停止错误。

于 2015-10-14T17:29:04.400 回答