如何等待执行控制从删除表中返回?
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 中从具有外键的表中删除行
如何在从多个表中获取多行的同时删除 sql JOIN 中的重复项