MS Access错误更新带有长文本的备注字段

时间:2017-03-22 07:15:56

标签: vba ms-access memo

搜索此问题会返回相当多的搜索命中,但会有许多偏离轨道的答案,因此我在此处发布简明描述,并在下面回答。

此问题折磨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值首先放入Memo字段的原因。

许多海报都注意到,如果UPDATE尝试将超过约2000个字符的字符串放入备注字段中,则会出现这种情况。这是一个惊喜,因为备注字段应该能够容纳1个字符或更多字符,具体取决于版本,即使它只允许65k通过UI。

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

2 个答案:

答案 0 :(得分:0)

引发此错误的关键因素是具有索引的备注字段。显然,虽然备注类型字段可以容纳数十亿字符,但索引不能超过2000左右。

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

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

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

答案 1 :(得分:0)

解决方法解决方案

创建两个宏(Macro1 Macro2)

宏1 从打开的表单中获取所有必要的信息,包括长文本并关闭它。

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

仅使用运行Macro2的按钮创建表单(Form_on_error)

最后在宏1的末尾添加

出错时

转到:宏名称

宏观名称:On_Error_2590

RunMacro Macro2

Submacro On_error_2590

OpenForm (Form_on_error)

结束子宏

.......而且有效!!!

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