【问题标题】:MS Access Error updating memo field with long textMS Access 错误更新带有长文本的备注字段
【发布时间】:2017-08-14 04:16:39
【问题描述】:

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

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

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

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: vba ms-access memo


    【解决方案1】:

    解决办法

    创建两个宏(Macro1 Macro2)

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

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

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

    最后在宏1的末尾添加

    出错

    转到:宏名

    宏名称:On_Error_2590

    RunMacro 宏2

    子宏 On_error_2590

    OpenForm (Form_on_error)
    

    结束子宏

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 有趣。但是,您是否在有或没有确认这一点的索引的情况下运行测试?如果是这样,正如您所提到的,我想解决方案是将前 2000 个字符复制到一个单独的字段,然后对其进行索引。具有讽刺意味的是,该字段也必须是长文本。
      • 不确定您要进行的确认测试。正如我在“易于验证”中指出的那样,是的,我确实尝试了同一个数据库的两个副本,其中包含一个包含备注字段的表,有和没有索引。当使用长度超过 2000 个字符的字符串进行更新时,具有索引的表在 memo 列中会获得 #Error 值,而未索引的表则不会。我没有缩小导致失败的字符的确切数量,我不确定它一定是一个常数。实际上,如果格式设置为 RTF,则索引可能包含也可能不包含 RTF 前导码。
      • 好的。由于您只看到了偏离轨道的答案,因此我会坚持使用您的解决方法。
      • 听起来您正在寻找更官方的确认问题可归因于索引,因此解决方法是 (a) 需要并且 (b) 绕过问题。我欢迎任何人发布指向权威来源的链接以确认或进一步详细说明问题。
      • 不,我没有——我的印象是您已经进行了仔细的测试并且可以重复“问题”,因此可能没有太多要添加的内容。尽管如此,任何关于这个问题的官方说明都会受到欢迎。
      猜你喜欢
      • 2016-04-24
      • 2018-08-14
      • 1970-01-01
      • 2017-06-12
      • 2017-04-27
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多