MS Access 异步查询

Posted

技术标签:

【中文标题】MS Access 异步查询【英文标题】:MS Access Asynchronous Queries 【发布时间】:2013-04-05 14:11:45 【问题描述】:

我有一个从 Access 表单触发的基本 SELECT 查询,需要一段时间才能执行,所以我想异步运行查询并允许我的用户继续使用表单(或者至少让他们在进展)。

问题在于,在执行代码时,Access 会冻结应用程序,在用户看来已经崩溃 - 甚至到 Windows 将其标记为“无响应”并提供终止它的地步。显然不是很人性化!我尝试使用 MSDN 上列出的代码here 和变体方法here。

这两种解决方案似乎都“异步”运行查询(触发异步查询的代码块完成,rs_FetchProgressrs_FetchComplete 事件(或第二个解决方案中的cn_ExecuteComplete 事件)触发并运行。 ..但是在查询执行完成之前Access的界面仍然锁定。在各个地方调用RepaintDoEvents(例如rs_FetchProgress事件)似乎没有任何效果。

我怀疑它的相关信息,但 SELECTed 的视图位于 SQL Server 中,该视图不会返回大量数据,但处理大约需要 20 秒。

【问题讨论】:

您尝试使用DoEvents 我有一段时间没有使用 Access,但曾经有一个“传递”选项,后端将执行完整的查询,包括连接和按 where 过滤-健康)状况。当不使用直通模式时,Access 通过网络从后端带来大量数据,并在客户端执行大量工作,并且这种行为似乎是同步的。 我做到了,用Repaint 在各个地方进行了宣传。好像没什么效果。 VBA 是单线程的,因此无论 ADO 提供什么异步性,您的 Access 应用程序能做什么都是值得怀疑的。也就是说,看看这个:support.microsoft.com/kb/194960 @Tim 尝试使用直通查询,但不幸的是无济于事 【参考方案1】:

打开表单时不要拉出巨大的记录集。表单基于一个查询,它在第一次加载时只提取很少甚至没有记录。然后为用户提供一种方法来选择不同的合理大小的记录子集。

无论您的数据源是链接的 Access 表还是客户端-服务器数据库,都尽量避免拉取大量记录集。

【讨论】:

没有很大的记录集可供提取 - 查询仅返回大约 80 条记录。它从需要较长时间处理的视图中进行选择(在较大的记录集上执行各种聚合) 好的,我没有从你的问题中得到答案。我没有遇到过这样的情况。假设您已经用尽了优化视图的所有选项,我想我会尝试使用单行虚拟值打开表单。然后在稍后的事件(加载或当前)中,异步打开 ADO 记录集并使用客户端。完全填充后,将其分配为表单的记录集。但我不知道是否足以消除“无响应”问题。它可能被证明和你现在拥有的一样不合适。

以上是关于MS Access 异步查询的主要内容,如果未能解决你的问题,请参考以下文章

从 MS Access VBA 通过 ODBC 进行 MySQL 查询:ADODB 异步执行不起作用

MS access 使用相对路径查询多个 MS Access 数据库

查询不会更新子窗体 MS-Access 中的表

SQL 查询和 MS Access 查询返回不同的数据

MS Access UPDATE 查询很慢

MS Access 查询条件示例