如何等待执行控制从删除表中返回?

Posted

技术标签:

【中文标题】如何等待执行控制从删除表中返回?【英文标题】: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) 慢得多的主要原因。 【参考方案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 之前,您无法退出循环。 当数字最后变成零时,您可以退出循环并继续执行。

【讨论】:

以上是关于如何等待执行控制从删除表中返回?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SAP ASE Sybase 16 中从具有外键的表中删除行

如何从 DbVisualizer 中删除表中的重复行

如何在从多个表中获取多行的同时删除 sql JOIN 中的重复项

如何删除EXCEL表中的大量数据行,要删除的行数大概8万

当引用表中没有匹配的记录时,delete语句如何与REFERENCE约束冲突?

如何删除数据库中的一行