0

搜索这个问题会返回很多搜索结果,但有很多偏离轨道的答案,所以我在这里发布一个简明的描述,并在下面回答。

该问题困扰 Microsoft Access 2010 和之前的某些版本。Access 2013 将备注类型重命名为长文本。我不知道它是否有同样的问题。

在某些特定情况下,根本问题与在具有备注字段的表上运行 UPDATE 查询有关。这可能是在可视化查询窗口中组成的 UPDATE 查询,或者是一些通过 DAO 或 ADO 或类似方式运行 SQL 的 VBA。或者它可能在通过表单更新时出现。

(当前的帖子只关注在 Access 数据库中发生的这种情况,尽管在其他地方你会发现当 Access 连接到外部数据库服务器时类似的问题的讨论。)

Access(或者可能是 Jet)不会立即生成明显的错误警报,而是将值 #Error(不仅仅是字符串“#Error”!)放入备忘录字段中。这可能很容易直到稍后才被注意到,从而导致可见的错误,例如:

-- 你使用 Compact 和 Repair。这似乎完成了,但 Access 悄悄地添加了一个包含几行的 MSysCompactError 表。一个错误 -1611 抱怨 Access 已停止并且无法完成操作。第二个看起来更具体的错误抱怨它找不到“描述”字段。这似乎是一个没有相关性的内部错误。

-- 您尝试将表复制到另一个数据库。Access 给出一个错误,抱怨另一个用户正在使用该表或已更新该表,并且不会完成该操作。

-- 对您没有注意到的、碰巧包含#Error 值的行的其他操作失败。

无论如何,根本问题是导致#Error 值首先放入备忘录字段的原因。

许多张贴者指出,如果 UPDATE 尝试将长度超过大约 2000 个字符的字符串放入备注字段,则会发生这种情况。这是一个惊喜,因为备忘录字段应该能够根据版本保存 1 个或更多的字符,即使它只允许通过 UI 显示 65k。

那么为什么在使用 >2000 个字符进行更新时会出现错误呢?

4

2 回答 2

0

解决方法

创建两个宏(Macro1 Macro2)

宏 1 从包含此长文本的打开表单中获取所有必要信息并将其关闭。

宏 2 插入所有需要的操作(从出现错误的更新查询开始)

创建一个只有一个运行 Macro2 的按钮的表单 (Form_on_error)

最后在宏1的末尾添加

出错时

转到:宏名称

宏名称:On_Error_2590

RunMacro 宏 2

子宏 On_error_2590

OpenForm (Form_on_error)

结束子宏

.......它的工作原理!

所以,只有当更新查询出错时,用户必须点击表单上的按钮:Form_on_error

于 2020-12-13T01:47:00.910 回答
0

引发此错误的关键因素是具有索引的备注字段。显然,虽然备忘录类型字段可以容纳无数个字符,但索引不能处理超过 2000 个字符。

知道这是促成因素,可能会想到一些解决方法。首先,您显然可以禁用索引。这个解决方案很容易在一个虚拟数据库中验证:创建两个包含备注字段的表,一个有索引,另一个没有。运行更新查询,将 >2000 个字符放入每个备忘录并记下结果。

但也许你认为你需要索引?如果您创建第二个字段,该字段将包含主备忘录的初始子字符串(少于 2000 个字符),并改为索引,则您的用例可能会得到满足。例如,这可以用于排序目的。在大多数情况下,备忘录包含叙述信息,备忘录数据值不太可能仅在 2000 个字符之后有所不同。或者,也许您可​​以设计一个散列函数并为其创建一个单独的列。

如果您的数据库已经包含这些 #Error 值怎么办?网上流传的一些建议,特别是与压缩和修复失败等下游问题有关的建议,表明您的数据库已损坏,应该放弃。我不确定。如果您可以删除#Error-afflicted 行,然后删除索引,然后重新创建已删除的行,您可能会重新开始工作。压缩和修复此时应该可以正常运行,让您确信您修复了有问题的部分。(显然,在此过程中进行备份。)

于 2017-03-22T07:15:55.593 回答