Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba MS Access更新长文本备忘录字段时出错_Vba_Ms Access_Memo - Fatal编程技术网

Vba MS Access更新长文本备忘录字段时出错

Vba MS Access更新长文本备忘录字段时出错,vba,ms-access,memo,Vba,Ms Access,Memo,搜索这个问题会返回相当多的搜索结果,但是有很多偏离正轨的答案,所以我在这里发布了一个简明的描述,下面是答案 这个问题困扰着微软Access 2010和以前的一些版本。Access 2013将备忘录类型重命名为长文本。我不知道它是否有同样的问题 在某些特定情况下,根本问题与对带有备注字段的表运行更新查询有关。这可能是在可视化查询窗口中组成的更新查询,或者是通过DAO或ADO或类似方式运行SQL的某些VBA。或者,在通过表单进行更新时可能会出现这种情况 (当前的帖子只关注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使用65k


那么,为什么在使用>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_error

interest。但是你有没有在有索引和没有索引的情况下运行测试来证实这一点?如果是这样的话,正如您所提到的,我想解决方案是将前2000个字符复制到一个单独的字段,然后在该字段上建立索引。具有讽刺意味的是,该字段也必须是长文本。不确定您要求的是确认测试。正如我在“易于验证”中所指出的,是的,我确实尝试了同一数据库的两个副本,其中一个表包含一个备注字段,有索引和无索引。当使用长度超过2000个字符的字符串进行更新时,具有索引的表会在备注列中获得#错误值,而未索引的表则不会。我没有缩小导致失败的字符的确切数目,我也不相信它一定是一个常数。实际上,如果格式设置为RTF,则索引可能包括也可能不包括RTF preamble.OK。由于您只看到了偏离正轨的答案,我将坚持您的解决方案。听起来您希望得到更多的官方确认,即问题可归因于索引,因此需要(a)解决方案,并且(b)绕过问题。我欢迎任何人向权威消息来源发布链接,以确认或进一步详细说明问题。不,我不知道-我的印象是,您已经进行了仔细的测试,可以重复“问题”,因此可能没有太多补充。尽管如此,关于这个问题的任何官方声明都将受到欢迎