Vba MS Access更新长文本备忘录字段时出错
搜索这个问题会返回相当多的搜索结果,但是有很多偏离正轨的答案,所以我在这里发布了一个简明的描述,下面是答案 这个问题困扰着微软Access 2010和以前的一些版本。Access 2013将备忘录类型重命名为长文本。我不知道它是否有同样的问题 在某些特定情况下,根本问题与对带有备注字段的表运行更新查询有关。这可能是在可视化查询窗口中组成的更新查询,或者是通过DAO或ADO或类似方式运行SQL的某些VBA。或者,在通过表单进行更新时可能会出现这种情况 (当前的帖子只关注Access数据库中的这种情况,不过在其他地方,当Access连接到外部数据库服务器时,您会发现类似的问题。) Access(或者Jet)将值#error(不仅仅是字符串“#error”!)放在备注字段中,而不是立即生成明显的错误警报。这可能很容易被忽略,直到稍后的某个时间,导致可见的错误,例如: --您使用的是紧凑型和可修复型。这似乎完成了,但Access悄悄地添加了一个带有几行的MSysCompactError表。一个错误-1611投诉访问已停止,无法完成操作。第二个看起来更具体的错误是,它无法找到字段“Description”。这似乎是一个没有相关性的内部错误 --您尝试将该表复制到另一个数据库。Access发出错误,抱怨其他用户正在使用该表或已更新该表,并且无法完成该操作 --您未注意到的行上的其他操作碰巧包含#错误值失败 不管怎样,根本问题是导致#Error值首先被放入Memo字段的原因 许多海报都指出,如果更新尝试将长度超过2000个字符的字符串放入备注字段,则会发生这种情况。这是一个惊喜,因为根据版本的不同,备忘录字段应该能够容纳1 gig或更多字符,即使它只允许通过UI使用65kVba MS Access更新长文本备忘录字段时出错,vba,ms-access,memo,Vba,Ms Access,Memo,搜索这个问题会返回相当多的搜索结果,但是有很多偏离正轨的答案,所以我在这里发布了一个简明的描述,下面是答案 这个问题困扰着微软Access 2010和以前的一些版本。Access 2013将备忘录类型重命名为长文本。我不知道它是否有同样的问题 在某些特定情况下,根本问题与对带有备注字段的表运行更新查询有关。这可能是在可视化查询窗口中组成的更新查询,或者是通过DAO或ADO或类似方式运行SQL的某些VBA。或者,在通过表单进行更新时可能会出现这种情况 (当前的帖子只关注Access数据库中的这种情
那么,为什么在使用>2000个字符进行更新时会出现错误?引发此错误的关键因素是具有索引的备注字段。显然,虽然Memo类型字段可以容纳大量字符,但索引不能处理超过2000个字符 知道这是一个促发因素,可能会想到一些变通办法。首先,您显然可以禁用索引。这个解决方案在虚拟数据库中很容易验证:创建两个包含备注字段的表,一个带索引,另一个不带索引。运行更新查询,将>2000个字符放入每个备忘录,并记录结果 但也许你认为你需要索引?如果您创建第二个字段,该字段将包含主备忘的初始子字符串(少于2000个字符),并对其进行索引,您的用例可能会得到满足。例如,这可以用于排序目的。在大多数情况下,如果备忘录包含叙述性信息,则备忘录数据值不太可能仅在2000个字符之后才有所不同。或者你也可以设计一个散列函数,并将其单独列出来 如果您的数据库已经包含这些错误值,该怎么办?网上流传的一些建议,特别是与压缩和修复失败等下游问题有关的建议,表明您的数据库已损坏,应该放弃。我不太确定。如果您可以删除受错误影响的行,然后删除索引,然后重新创建删除的行,那么您可能会重新开始工作。在这一点上,Compact和Repair应该能够正常运行,从而使您有信心修复了有问题的部分。(很明显,一路备份。)解决方案 创建两个宏(Macro1 Macro2) 宏1 从包含此长文本的打开表单中获取所有必要信息,然后关闭它 宏2 插入所有需要的操作(从您得到的更新查询开始) 仅使用运行Macro2的按钮创建表单(form_on_error) 最后在宏1的末尾添加 论错误 转到:宏名称 宏名称:On_错误_2590 宏宏宏宏2 子宏On_错误_2590
OpenForm (Form_on_error)
端次宏
……而且很有效
因此,只有当更新查询出现错误时,用户才必须单击表单上的按钮:form_on_errorinterest。但是你有没有在有索引和没有索引的情况下运行测试来证实这一点?如果是这样的话,正如您所提到的,我想解决方案是将前2000个字符复制到一个单独的字段,然后在该字段上建立索引。具有讽刺意味的是,该字段也必须是长文本。不确定您要求的是确认测试。正如我在“易于验证”中所指出的,是的,我确实尝试了同一数据库的两个副本,其中一个表包含一个备注字段,有索引和无索引。当使用长度超过2000个字符的字符串进行更新时,具有索引的表会在备注列中获得#错误值,而未索引的表则不会。我没有缩小导致失败的字符的确切数目,我也不相信它一定是一个常数。实际上,如果格式设置为RTF,则索引可能包括也可能不包括RTF preamble.OK。由于您只看到了偏离正轨的答案,我将坚持您的解决方案。听起来您希望得到更多的官方确认,即问题可归因于索引,因此需要(a)解决方案,并且(b)绕过问题。我欢迎任何人向权威消息来源发布链接,以确认或进一步详细说明问题。不,我不知道-我的印象是,您已经进行了仔细的测试,可以重复“问题”,因此可能没有太多补充。尽管如此,关于这个问题的任何官方声明都将受到欢迎