【问题标题】:Linked Access DB "record has been changed by another user"链接访问数据库“记录已被其他用户更改”
【发布时间】:2010-11-01 15:58:15
【问题描述】:

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

数据库设计很差,你就忍着吧。

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

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

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

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

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

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

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

有什么想法吗?

【问题讨论】:

    标签: sql ms-access linked-tables


    【解决方案1】:

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

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

    【讨论】:

    • 这对我完全有用,我将空位列更新为零并且错误消失了。
    • 谢谢一百万。多么奇怪的行为。
    • 请记住确保位字段不能设置为空,否则您将不得不接受 birger 的回答。
    • 您可以在此处查看有关此“行为”的 Microsoft KB:support.microsoft.com/kb/280730/EN-US
    • 这就是 StackOverflow 的用途。 Pre-Internet 我本可以花费数周时间来解决这个问题,但我从来没有想过这个答案。只是添加一些额外的东西:如果你有一个链接表,不要忘记在 Access 中运行代码来刷新链接;并确保 SQL Server 中的位字段具有所有现有行的值,以及新行的默认值。非常感谢!
    【解决方案2】:

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

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

    【讨论】:

    • 这其实是一个重要的建议。我理所当然地在我的所有 SQL Server 表中放置了一个时间戳字段。
    • 如果链接表还链接到另一个作为共享数据的访问文件中怎么办?我试图添加时间戳列。您的意思是名称将是时间戳?
    • 所以要清楚,该字段必须准确命名为“时间戳”?
    • 名字无所谓,数据类型必须是TimeStamp。
    【解决方案3】:

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

    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 和重新查询(或重置记录源),只需在现有表单中添加新记录,将序列字段设置为新值并立即保存记录。

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

    【讨论】:

    • 这实际上是我尝试过的解决方案。我在计算完序列号后立即保存了记录。但是之后的任何字段更改都会导致更新期间出现错误。我什至做了一个 Me.Refresh 并没有用。天哪,我什至存储了 ID,执行了 Me.Requery,然后移回该 ID,但这也不起作用。同样的错误!
    • 然后还有其他事情发生。关键是您要么想在表单中编辑数据,要么通过 SQL。你不想两者都做,除非你确切地知道你在做什么。
    【解决方案4】:

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

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

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

    【讨论】:

    • 哪些数据库的 ODBC 驱动程序具有此功能?我刚刚检查了我系统的 ODBC 设置,甚至 SQL Server Express 2008 R2 也缺少任何此类设置。无论如何,Access 前端的正常做法是要求服务器数据库在所有表中都有时间戳字段,我认为这将消除您对建议的需要。
    • 啊,我正在查看标签,但没有显示 sql server - 他的问题确实如此(这是我的错)。行版本控制是 ODBC for PostgreSQL 中的一个选项。看起来SQL_CONCURRENCY 是 SQL Server 中的答案(它提到向表中添加时间戳)。另一方面,我认为 Postgres 使用内部 id oid
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

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

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

            【讨论】:

              【解决方案10】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-01-04
                • 2012-10-02
                • 1970-01-01
                • 1970-01-01
                • 2018-03-31
                相关资源
                最近更新 更多