在make table查询完成之前打开MS Access表单

时间:2011-11-29 23:21:46

标签: sql-server-2005 ms-access dao synchronous

在我的访问数据库中,我有TABLE1,它是SQL 2005服务器表的链接表。我有一个查询QUERY1,它选择TABLE1的一个子集,操作/格式化它的一些数据,并将该数据放入临时表TMP_TABLE1(即SELECT * INTO [TMPTABLE1] FROM [TABLE1])。我还有一个表单FORM1,它有TMP_TABLE1作为其记录源,我可以在其中查看和操作数据。

以下是完成这些任务的代码:

On Error Resume Next
DoCmd.DeleteObject acTable, "TMPTABLE1"
On Error GoTo 0

DoCmd.SetWarnings False
CurrentDb.Execute "QUERY1", dbSeeChanges
DoEvents
DoCmd.SetWarnings True

DoCmd.OpenForm "FORM1", acNormal, , , , acDialog

我遇到的问题是我的FORM1尝试在我的QUERY1完成处理之前打开,我收到一条错误,指出我的表不存在。我一直经历CurrentDb.Execute作为同步查询,并且最近才遇到这种行为。如果我在打开表单之前放置​​一个短暂的暂停或等待创建表的循环,我的过程将正常工作。

不幸的是,这只是我无法弥补的潜在问题的一个例子。例如,即使我保留临时表并简单地删除所有记录并附加所有新记录,问题仍然存在。这种情况发生在我在屏幕上显示数据之前操作代码中的数据,例如INSERT语句,UPDATE语句,DAO.Recordset和ADODB.Recordset对象。

我已经在Windows 7 64位,Windows Vista 32位和Windows XP 32位上测试了编译和未编译的客户端,所有这些都以相同的方式做出反应。这个问题是间歇性的,有时查询会很快完成,我的表单会正确打开,但有90%的时间无法打开。

有没有人对我能做什么有任何想法?也许设置被更改为以不同方式运行查询?它可能是我需要更改的SQL Server 2005选项/设置吗?

编辑: 下面是我能想到的最冗长的代码,试图等待表准备就绪,但它仍然失败。有时,我的执行过程抛出一个错误,说TMPTABLE1已经存在,即使我在函数的开头删除它。:

On Error Resume Next
DoCmd.DeleteObject acTable, "TMPTABLE1"
On Error GoTo 0

Dim wrk As DAO.Workspace
Set wrk = DBEngine.Workspaces(0)
Dim dbs As DAO.Database
Set dbs = CurrentDb
wrk.BeginTrans
On Error GoTo TransErr
dbs.Execute "QUERY1", dbSeeChanges Or dbFailOnError
wrk.CommitTrans
TransResume:

Dim waitLoop As Long
Do While TableDefExists("_working_ReceivedMaterials") = False
    waitLoop = GetTickCount
    Do While GetTickCount < waitLoop + 100
        DoEvents
    Loop
Loop

DoCmd.OpenForm "ReceivedMaterials_Entry", acNormal, , , , acDialog

Exit Function
TransErr:
    wrk.Rollback
    GoTo TransResume

2 个答案:

答案 0 :(得分:2)

您是否尝试过执行

CurrentDb.TableDefs.Refresh

在打开表单之前?

Dim db As DAO.Database

Set db = CurrentDb

On Error Resume Next
db.TableDefs.Delete "TMPTABLE1"
On Error GoTo 0

DoCmd.SetWarnings False
db.Execute "QUERY1"
DoCmd.SetWarnings True

db.TableDefs.Refresh

DoCmd.OpenForm "FORM1", WindowMode:=acDialog
db.Close: Set db = Nothing

答案 1 :(得分:2)

访问可能会在删除表格然后重新创建它们时显示奇怪的行为,因此我不认为您的代码会绊倒自己,我认为最好的解决方案是编辑表单并将记录集更改为空。然后在表单“On_Load”事件中,设置记录集,例如:

Private Sub Form_Load()

Me.Recordset =“SELECT * FROM TMPTABLE1”

End Sub

或者,不要删除表,只需运行“DELETE FROM TMPTABLE1”,然后使用“INSERT INTO TMPTABLE1 SELECT * FROM TABLE1”而不是生成表查询

相关问题