Multithreading MS Access中的多线程,异步处理

Multithreading MS Access中的多线程,异步处理,multithreading,ms-access,vba,Multithreading,Ms Access,Vba,我知道这个标题听起来很疯狂,但我的情况是这样的 在某个用户事件之后,我需要更新一些与用户当前正在做的事情“无关”的表。目前,这需要几秒钟的时间来执行,并且会给用户带来一定程度的挫败感。有没有一种方法可以在第二个过程中执行我的更新,或者在我的应用程序正在处理时不会“冻结”UI 谢谢我会解决问题的核心-调整数据更新查询以更快地运行 尽管如此,MS Access不支持多线程 因此,当您对过程进行阻塞调用时,MS Access将冻结屏幕,直到调用返回 编辑 如果您通过缓慢的网络连接更新一个大表,DAO并

我知道这个标题听起来很疯狂,但我的情况是这样的

在某个用户事件之后,我需要更新一些与用户当前正在做的事情“无关”的表。目前,这需要几秒钟的时间来执行,并且会给用户带来一定程度的挫败感。有没有一种方法可以在第二个过程中执行我的更新,或者在我的应用程序正在处理时不会“冻结”UI


谢谢

我会解决问题的核心-调整数据更新查询以更快地运行

尽管如此,MS Access不支持多线程

因此,当您对过程进行阻塞调用时,MS Access将冻结屏幕,直到调用返回

编辑

如果您通过缓慢的网络连接更新一个大表,DAO并不是您最好的朋友。您可能需要考虑切换到使用ODBC连接并运行优化更新语句。

编辑2

当您使用ODBC时,必须编写ADO样式的代码来实现这一点。注意这个示例,这个代码是OTTOMH

dim myConn as ADODB.Connection
dim myCmd as ADODB.Command

set myConn = new ADODB.Connection
myConn.ConnectionString = "Provider=SQLOLEDB;Server=MyServerName;Initial Catalog=MyCatalogName;UID='XXX';PWD='YYY'"
myConn.Open

set myCmd =  new ADODB.Command (myConn)
myCmd.SQL = "Update MyTable Set MyColumn = '" & MyDataVariable & "' Where MyPK = '" & MyPKVariable & "'"
myCmd.Execute

myCmd.close
myConn.close

在update语句之前使用docmd.hourglass true,在update语句之后使用docmd.hourglass false将curasor更改回来。还要确保在错误处理例程中输入docmd.hourglass false


虽然不是最理想的解决方案,但它可能有助于提高用户的期望水平。

客户是否需要确认信息已更新?如果没有,那么您可以打开一个shell例程来为您处理更新。i、 e

Shell('C:\Reports\SomeOtherAccessDB.MDB'/x'SomeMacro',1)

默认情况下,这是异步的,因此在运行所需的几秒钟内,用户只会在任务栏上看到第二个.mdb

编辑
哦,真的关心用户的时间,真是太好了

您正在更新的数据在哪里?发布您用于更新的代码,因为我们可能会在那里给您一些建议。VBA中的某些内容同步运行,而某些内容异步运行。这完全取决于你在做什么。您可以通过明智地使用DoEvents来释放UI控件。这是一个很好的观点。但是,我实际上是在用DAO更新一条记录,通过网络打开一个链接表。网络并不是最新和最棒的,但我每小时都在做工作,没有解决这个问题的能力。实际的表在哪里?您的ODBC连接建议似乎很有希望。但是…当我尝试创建文件DSN并尝试链接表时,Access会给我以下错误:“您不能使用ODBC从外部Microsoft Office Access或ISAM数据库表导入、导出或链接到您的数据库。”我缺少什么?@LanguaFlash answer edited to add sample此答案完全错误。如果您使用的是ODBC链接表,DAO无疑是您的最佳选择,Jet将把Jet知道可以在服务器上处理的任何请求都交给服务器。这里的示例ADO代码中的批处理更新将始终正确地传递给服务器。在我看来,使用ADO运行ODBC完全是错误的——如果您选择ADO,那么就使用OLEDB并直接连接,完全避免使用ODBC!在任何情况下,您都应该先尝试一个passthrough,然后再在代码中胡闹。