通过 ODBC 将未更改的记录写入 MySQL 时,如何解决 MS Access 中的写入冲突错误?

问题描述 投票:0回答:3

如果用户手动恢复对 Access 中链接表中字段的更改,导致记录整体未修改,则在尝试保存记录时将显示“写入冲突”错误消息。例如,用户对记录进行了一次更改,将字段从 10 更改为 20,然后在不保存记录的情况下重新输入原始值 10。

Office 专业增强版 2016

MySQL 8.028

要重现此行为:

  1. 在MySQL中创建测试数据库
CREATE SCHEMA test;
USE test;
CREATE TABLE testtable (
  ID INT NOT NULL,
  ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  col1 INT NULL DEFAULT NULL,
  col2 INT NULL DEFAULT NULL,
  PRIMARY KEY (ID))
ENGINE = InnoDB;
  1. 使用用户 DSN 和 ANSI MySQL 驱动程序创建到测试数据库的 ODBC 连接
  2. 创建一个空白的access数据库并链接到测试表
  3. 打开测试表并输入并保存几个虚拟行。更改某一列字段中的值。无需离开该行或使用撤消功能,只需将原始值键入回字段中即可。尝试保存该行。

我特意添加了时间戳来证明这不是一个解决方案。

如果任何知道导致这种行为的原因以及如何预防这种行为的人提供建议,我将不胜感激。

mysql ms-access odbc
3个回答
0
投票

我找到了一个解决方法,虽然不太理想,但确实有效。我在 SQL 表中添加了一个名为“changeflag”的布尔字段。在 Access 表单的 OnDirty 事件中,我调用一个简单的过程来更改该字段的值。这样,即使用户手动撤消所做的更改,其他地方的数据仍然会发生更改,并且不会再发生写入冲突。代码如下。

私人子表格_Dirty(取消为整数)
变更标志 = 不是变更标志
结束子


0
投票

事实证明,解决方案隐藏在 MYSQL ODBC 文档中,需要设置 FOUND_ROWS 连接器/ODBC 选项。在 GUI 中,它位于数据源配置的“光标/结果”选项卡下:“返回匹配的行而不是受影响的行”。更改此设置后,不再发生冲突。


0
投票

是的,我有。我能想到的最好的解决方法是向表中添加一个 DATETIME 字段。我称之为行版本。在表单的OnDirty事件中添加以下代码:

行版本=现在

这样做的目的是,每当用户进行更改时,记录都会更新为当前日期和时间。如果他们手动撤消更改,则记录仍会更新并同步到服务器。

© www.soinside.com 2019 - 2024. All rights reserved.