【问题标题】:multi-thread in MS Access, async processing [duplicate]MS Access中的多线程,异步处理[重复]
【发布时间】:2011-02-23 08:17:48
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 您要更新的数据在哪里?
  • 发布您用于更新的代码,因为我们可能会在那里给您一些建议。
  • VBA 中有些东西是同步运行的,有些是异步运行的。这完全取决于你在做什么。您可以通过明智地使用 DoEvents 来释放 UI 控制。

标签: multithreading ms-access vba


【解决方案1】:

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

话虽如此,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

【讨论】:

  • 这是一个很好的观点。但是,我实际上是使用通过网络打开链接表的 DAO 更新单个记录。该网络不是最新最好的,但我按小时工作,对这个问题无能为力。
  • 实际的表在哪里?
  • 您的 ODBC 连接建议似乎很有希望。但是...当我尝试创建文件 DSN 并尝试链接表时,Access 给我以下错误:“您不能使用 ODBC 导入、导出到外部 Microsoft Office Access 或 ISAM 数据库表或将其链接到您的数据库。”我错过了什么?
  • @LanguaFlash 回答已编辑以添加示例
  • 这个答案是错误的。如果您使用 ODBC 链接表,DAO 无疑是您的最佳选择,并且 Jet 会将 Jet 知道可以在服务器上处理的任何请求交给服务器。像此处示例 ADO 代码中的批量更新将始终正确地传递给服务器。使用 ADO 运行 ODBC 对我来说似乎完全是错误的——如果您选择 ADO,那么使用 OLEDB 并直接连接并完全避免使用 ODBC!在任何情况下,您都应该先尝试直通,然后再乱写代码。
【解决方案2】:

在更新语句之前使用 docmd.hourglass true 并在之后使用 docmd.hourglass false 将光标改回。还要确保将 docmd.hourglass false 放入您的错误处理例程中。

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

【讨论】:

    【解决方案3】:

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

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

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

    编辑

    哦,感谢您真正关心用户的时间!

    【讨论】:

      猜你喜欢
      • 2010-10-18
      • 1970-01-01
      • 2013-09-10
      • 2016-05-16
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多