2010-06-23 22 views
2

我有以下代碼:如何等待執行控制從刪除表中返回?

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

將從MS Access數據庫刪除表。通常這是在共享網絡上使用數據庫完成的。

如何確保DROP方法在允許控件移動到代碼中的下一行之前完成?

這是在VBA MS Access 2003中完成的;但如果版本影響答案,我會感興趣。

+0

嗯,是什麼讓你覺得它異步執行?我很確定,代碼行CurrentDB.Execute在完成之前不會移動到下一行。您是否遇到以下代碼行中CurrentDB.TableDefs中表仍然存在的情況? – 2010-06-23 23:36:36

+0

這是一個很好的觀點。其實,我認爲你是對的。在這種情況下,我正在檢查表名是否仍然存在,但在執行CurrentDb.Execute命令之前實例化的數據庫對象的「新建」副本中。 – 2010-06-24 04:13:22

+2

如果您使用DBEngine(0)(0)查看錶是否仍然存在,那麼一個問題就是如此。在這種情況下,返回數據庫對象的調用不會刷新集合,因此在刪除之後,該表仍會顯示在列表中,除非在檢查之前刷新TableDefs集合。每次調用時,CurrentDB刷新所有集合,這是它比DBEngine(0)(0)慢得多的主要原因。 – 2010-06-24 21:16:42

回答

2

這是我對河套方法:

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 
0

你可以用你的CurrentDb.Execute命令在裏面寫一個循環。 在循環內部,您將一個名爲TableName的表的數量存儲在一個變量中。 直到這個數字= 1,你不能退出循環。 當數字變爲最後零時,您可以退出循環並繼續執行。