我的 Access 前端与作为后端的 MySQL 发生“写入冲突”,但与作为后端的 SQLServer 没有发生冲突

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

我开发了一个由网络酒店托管的SQLServer 2016数据库,使用我的Win11 PC上最新版本的Access作为前端,通过ODBC连接。这可以正常工作,不会出现任何错误消息。 我想将 SQLServer 数据库的副本迁移到 MySQL/MariaDb 并使用相同的前端。 我已将数据库迁移到由同一网络酒店托管的 MariaDb 服务器,并确保不同表的时间戳字段已设置为“时间戳”、“无空值”、默认“当前时间戳”。使用最新的 MariaDB ODBC 驱动程序重新连接。 Access 表单使用的所有查询/视图仅存储在 Access 前端中。

我打开前端,是唯一的用户。没有错误!我打开一个仅基于一个表的连续表单,然后收到“写入冲突”,然后是 Access 3197 错误消息。如果我尝试运行更新数据的过程,则会出现相同的错误消息。直接在Access“表视图”中打开同一个表,不会产生冲突。我在 phpadmin 中使用 SQL 查询打开该表;没有冲突。

我进行了相同的练习,但现在将数据库迁移到我的 PC 上的 MySQL 服务器(“localhost”)。出现相同的“写入冲突”消息。 我认为 MySQL/MariaDb 和 SQLServer 中的记录锁定策略是不同的。 我的问题是,我可以采取什么措施来解决使用 MariaDb/MySQL 作为服务器的问题?

格哈德

mysql ms-access record-locking
1个回答
0
投票

最常见的问题是真/假列为空。您希望 100% 确定此类列的默认值为 0(或 false,并且不允许空值出现在此类列中 - 否则您会收到有关其他人如何修改记录的令人讨厌的消息)。

接下来,不要将 SQL Server“时间戳”列与日期/时间列混淆。 “timestamp”是 SQL Server 中列的世界上最糟糕的名称,而该时间戳列与时间的关系为零。该列类型是 rowversion 列。事实上,在幕后,该列实际上是一个 64 位无符号整数值,每次更新记录时它都会简单地递增 +1(因此它与时间或日期无关)。

下一个常见问题是浮点列的使用。由于计算机存储和保存浮点值的方式,舍入错误经常会发生。

用于确定记录更改的 Access 将与未更改的行进行逐列比较,并且由于浮点数经常四舍五入并且不进行比较(对于相等的测试),因此 Access 认为该记录已被某人更改否则。

因此,这意味着您要向表中添加行版本列(而不是日期时间列)。然后,Access 可以使用该“行版本”列作为更改测试,并且 Access 将不会使用逐列比较来确定记录是否已更改。

通常,对此类列使用小数类型或货币类型也可以解决此常见问题。

因此,请确保向数据库添加行版本列(如上所述,这与日期时间或某种时间戳值无关 - 它是行版本列,Access 应该能够使用该列代替默认返回逐列比较以确定记录是否已更改。

因此,日期、日期时间、时间、文本列的空值不应造成问题。

对于布尔(或位)列,空值将引起问题,并触发该消息。

如上所述,同样的情况通常适用于浮点值 - 这种比较通常会失败,因此引入行版本列应该可以修复该错误。

我很长一段时间没有使用MySQL,但我必须假设存在某种类型的行版本列。您可以尝试使用 MySQL TIMESTAMP 列,并确保为该列时间启用自动初始化和自动更新功能。不幸的是,这是基于时间的行版本,因此不太理想。

我最好的猜测是真/假列为空,或者您有浮点列类型。我会检查空值,并尝试对这些实际值使用十进制数据类型列。

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