微软更新重大Bug,造成access更新查询中,提示查询‘’中断(查询失败)的解决方案

2019-11-19 09:26:00
tmtony8
原创
814

有网友反馈平台运行出错,后面发现是微软补丁更新导致的。
不光是Access通用平台,其它使用Access更新查询的数据库在微软自动更新补丁后都有可能出现这个错误。而且微软暂时还没有修复的补丁,所以只能按照本篇技巧中下面的相关方法来处理。

先确保您出现的是以下错误:
1.查询 '' 中断

2.Query is corrupt 或  Critical Alert: Query is Corrupt, Error 3340


当运行一个更新查询时,它可能不运行并显示错误:"Query 'query name' is corrupt". (查询 中断)




这个更新查询错误发生条件:
1.直接更新单个表(即更新表,而不是Select查询或联接的输出)
2.指定WHERE子句(即在查询设计器的条件行中有条目)


这个问题影响所有支持的access版本

该问题在2019年11月12日通过以下MSI版本的补丁更新被引入:
Office 2010: Office 2010安全更新说明:2019年11月12日(KB4484127)
Office 2013: Office 2013安全更新说明:2019年11月12日(KB4484119)
2016年办公:2016年办公安全更新说明:2019年11月12日(KB4484113)
2016办公室:2019年11月12日,2016办公室更新(KB3085368)


微软预计修复的发布日期


短时解决方案:

1、卸载更新。

打开系统的“运行”或者直接输入win+r,输入“appwiz.cpl”,确定打开“添加或删除程序”(在控制面板打开亦可)

搜索相关您对应版本下载的补丁  卸载/删除,如office2010 即卸载(KB4484127)


对于Office 365用户,请遵循以下步骤:
1.打开Office并在“Account”下选择禁用更新选项。

2.使用此链接查找要还原为的Office版本:Update history for Office 365 ProPlus (listed by date),例如,“16.0.12130.20272”
3.下载office Deployment 工具 (Download)
4.按照提示将文件解压缩到一个容易访问的文件夹。
在该文件夹中,使用记事本创建一个名为“config”的新文件。xml包含:

<Configuration>
<Updates Enabled="TRUE" TargetVersion="16.0.12130.20272" />
</Configuration>

5.在提升的命令提示符中,将目录更改为解压文件的文件夹。然后运行以下命令:
setup.exe /configure config.xml

6.打开Office程序,进入账户页面,“立即获取更新”。这返回到更新16.0.12130.20272。



参考微软资源链接:How to revert to an earlier version of Office 2016 Click-to-Run




2、更新查询,更新另一个查询的结果,而不是直接更新表。


例如,如果有一个类似于这样的查询:
UPDATE Table1 SET Table1.Field1 = "x" WHERE ([Table1].[Field2]=1);
您可以创建一个新的查询(Query1)定义为:
SELECT * from Table1;
然后更新你原来的查询:
UPDATE Query1 SET Query1.Field1 = "x" WHERE ([Query1].[Field2]=1);
用Query1替换Table1 的引用
这可产生相同的结果,利用查询避免错误。



3、使用代码和记录集更新数据

在VBA中使用记录集。使用变量定义ADO或DAO记录集,编辑它


4、系统还原,此方案有风险,谨慎操作




相关的文章内容:


查询是针对当前数据库中的表,链接表还是链接的SQL Server表都没有关系。如果Access数据库引擎正在处理UPDATE查询,则会发生错误。

在此示例中,查询qryUpdateEmployee非常好。它以前曾经工作过,如果卸载了安全更新,它将再次工作。

受影响的程式
此问题影响:

自2010年以来的所有Microsoft Access版本,包括Access 2010、2013、2016和2019以及Office 365
32和64位版本的Microsoft Access
使用Access数据库引擎(ACE)和ADO连接到Access数据库(ACCDB和MDB)文件并使用查询更新它们的程序。这可能包括:
用Visual Studio .NET或Visual Basic 6编写的程序
基于ASP.net,经典ASP等构建的Web解决方案
在其他主机(例如Excel,PowerPoint,Word)中运行的VBA代码
使用ACE与Access数据库一起使用的Microsoft程序,例如PowerBI,Power Query和SQL Server Migration Assistant(SSMA)(我们尚未确认这些程序正在使用崩溃的更新查询)


微软的回应
我们与Microsoft Access开发团队保持联系,并且对于出问题的原因以及如何将如此严重的问题发布到世界上没有明确的答案。

我们与您一样担心,这样的安全更新比它们试图阻止的病毒或恶意软件引起的问题更大。

这是他们描述问题的网页: 访问错误:“查询已损坏”

Microsoft的修补程序的预计发布日期
Access 2010:内部版本7242.5000-2019年12月10日
Access 2013:内部版本5197.1000-2019年12月10日
Access 2016 MSI:内部版本4939.1000-2019年12月10日
Access 2019批量许可证:内部版本10352.20054-2019年12月10日
Access O365 / 2019(1911版):内部版本12228.20152-2019年11月24日(估计)
从现在起几周后,他们宣布的解决方案对于大多数情况显然是不可接受的。我们希望他们能够更快地做出响应,并且我们将在学习过程中提供更多信息。


即时解决方案:卸载安全更新

解决此问题的最佳方法是卸载此问题的根源Office安全更新。根据您的Access安装来自传统的永久许可证,ACE还是Office 365订阅,解决方案有所不同。


Office / Access的永久许可证和磁盘安装以及ACE分发安装

如果您通过永久许可证,本地安装程序/磁盘或分布式Access数据库引擎(ACE)直接在计算机上安装了Access / Office,则安全更新已安装在Office 365订阅服务之外的计算机上。请按照以下步骤查找并卸载更新:

  1. 按Windows键和R弹出运行提示。
  2. 键入“ appwiz.cpl”,然后按[确定]启动控制面板的“程序和功能”程序。
    运行命令
  3. 单击[查看已安装的更新]。
    查看已安装的更新
  4. 在搜索栏中,搜索以下KB。
    • Office 2010:KB4484127
    • Office 2013:KB4484119
    • Office 2016:KB4484113
  5. 在此系统上,存在KB4484127。
  6. 右键单击该程序,然后选择[卸载]。
  7. 单击[是]开始卸载过程。
  8. 提示将询问您是否准备好卸载。单击[卸载]按钮继续。
  9. 成功卸载更新后,单击[确定]。

根据我们的经验,如果此操作卸载了所有有害的安全更新,则无需重新启动即可解决问题。

不久我们将获得有关Office 365安装的其他信息。


Microsoft Office 365Office 365订阅(单击以运行)安装

对于Office 365用户,请按照下列步骤操作:

  1. 打开Office,然后在“帐户”下选择禁用更新的选项。
  2. 使用此链接来查找要还原到的Office版本: Office 365 ProPlus的更新历史记录(按日期列出)
    例如,“ 16.0.12130.20272”
  3. 下载Office部署工具(Download
    按照提示将文件解压缩到易于访问的文件夹中。
  4. 在该文件夹中,使用记事本创建一个名为“ config.xml”的新文件,其中包含:
    <配置>    
  5. 在提升权限的命令提示符下,将目录更改为您解压缩文件的文件夹。然后运行以下命令:
    setup.exe / configure config.xml 
  6. 打开一个Office程序,然后转到“帐户”页面,然后“立即获取更新”。这将还原为更新16.0.12130.20272。

Microsoft资源:如何还原到早期版本的Office 2016即点即用

无法卸载安全更新的替代解决方案

在某些情况下,您可能无法卸载安全更新。也许您或您的用户无权更改。或者,您正在将解决方案分发给不受您控制的机器的人。如果要确保即使安装了安全更新,您的Access应用程序都可以正常运行,则有以下几种选择:

  1. 修改所有查询,以免它们触发问题
  2. Microsoft Access 2007使用Access 2007或更早版本部署Access应用程序。您可以使用免费的Access 2007运行时来这样做。有关Microsoft Access Runtime页面的更多信息,其中包括免费下载的运行时程序。这假定您的Microsoft Access数据库在Access 2007中运行,并且不包括Access 2010或更高版本中引入的功能。请访问Microsoft Access版本功能页面,以查看版本之间的差异。

修改所有更新查询

如果决定修改查询,则需要找到所有触发错误的更新查询。这些可以是保存的查询和在代码中调用的SQL查询。一旦识别出它们,就需要对其进行修改,以便它们更新另一个查询的结果,而不是直接更新表。这些示例由Microsoft在上面引用的页面中提供。

例如,如果您有此查询被标记为损坏的查询:

更新表1 SET Table1.Field1 =“ x”([Table1]。[Field2] = 1);

您可以创建一个新查询(Query1),其定义为:

SELECT * from Table1;

并将您的原始查询更新为:

UPDATE Query1 SET Query1.Field1 =“ x”在哪里([Query1]。[Field2] = 1);

通过用Query1替换对Table1的所有引用,这将产生相同的结果并避免错误。



模块代码使用代码和记录集更新数据

到目前为止,在VBA,VB6或Visual Studio.NET代码中使用记录集来更新记录(例如,使用诸如rst之类的变量定义ADO或DAO记录集,打开记录并使用诸如rst.Edit和rst.Update)。

这些直接记录更新与发出更新查询不同,并且不受安全更新问题的影响。因此,另一个选择是用记录集更新替换“更新”查询。对于一些记录的一些简单更新,或者与此安全更新有一些此类冲突的应用程序(也许是单个数据输入表单或网页),这可能是有意义的。但是,更新查询仍然最适合更新一个表或多个表中的许多记录,因此不建议将其作为永久解决方案。




    分享