【问题标题】:How to wait for execution control to return from dropping a table?如何等待执行控制从删除表中返回?
【发布时间】:2010-06-23 17:06:22
【问题描述】:

我有以下代码:

CurrentDb.Execute "DROP TABLE [" & DatabaseName & "].[" & TableName & "];"

这将从 MS Access 数据库中删除一个表。通常这是使用共享网络上的数据库完成的。

如何确保DROP 方法在允许控件移动到我的代码中的下一行之前完成?

这是在 VBA MS Access 2003 中完成的;但如果版本会影响答案,我会很感兴趣。

【问题讨论】:

  • 呃,是什么让你认为它是异步执行的?我很确定 CurrentDB.Execute 代码行在完成之前不会移动到下一行。你有没有遇到过下面这行代码中CurrentDB.TableDefs中表还存在的情况?
  • 这是一个很好的观点。其实,我觉得你是对的。在这种情况下,我正在检查表名是否仍然存在,但是在执行 CurrentDb.Execute 命令之前实例化的数据库对象的“新”副本中。
  • 一个问题是,如果您使用 DBEngine(0)(0) 检查表是否仍然存在。在这种情况下,返回数据库对象的调用不会刷新集合,因此在删除之后,该表仍会显示在列表中,除非您在检查之前刷新了 TableDefs 集合。 CurrentDB 每次调用都会刷新所有集合,这是它比 DBEngine(0)(0) 慢得多的主要原因。

标签: sql ms-access vba


【解决方案1】:

这是我对 Loop 方法的看法:

Public Function DeleteTable(DatabaseName as String, TableName as String) as Boolean
     DeleteTable = False

        CurrentDb.Execute "DROP TABLE [" & DatabaseName & "].[" & TableName & "];"
        Do
        Loop Until TableExists(TableName, DatabaseName) = False     

     DeleteTable = True
End Function

Public Function TableExists(TableName As String, DatabaseName As String) As Boolean   

        If 0 = CurrentDb.OpenRecordset("SELECT COUNT(*) As Count FROM [" &   DatabaseName & "].[MSysObjects] WHERE [Name] = '" & TableName & "';").Fields("Count").Value Then
             TableExists = False
        Else
             TableExists = True
        End If
End Function

【讨论】:

    【解决方案2】:

    您可以使用 CurrentDb.Execute 命令编写一个循环。 在循环内部,您将名为 TableName 的表的数量存储在一个变量中。 在此数字 = 1 之前,您无法退出循环。 当数字最后变成零时,您可以退出循环并继续执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-19
      • 1970-01-01
      • 2015-04-18
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 2016-09-03
      相关资源
      最近更新 更多