【发布时间】:2011-11-29 23:21:45
【问题描述】:
在我的访问数据库中,我有 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
【问题讨论】:
-
您是否有充分的理由使用生成表查询 (MTQ) 而不是选择?我每天都会看到大量充满 MTQ 的蹩脚应用程序,导致表中有 50 万个未索引行。这通常会造成无法追踪、臃肿和令人作呕的混乱。
-
不,我没有特别的理由。正如我提到的,我的代码的其他区域也发生了类似的问题,我决定发布我认为最简单的例子。这已经工作了 3 年多,直到我们最近将后端从 Access 表迁移到 SQL 2005 表。由于一组 DELETE/INSERT 查询适用于这个特定示例,我现在将结束它并重新发布该问题的不同示例。
-
只是一个问题,因为我在这一点上没有什么经验,但你确定你的 beginTrans/commitTrans 行真的做了什么吗?我发现事务(应用于 wrk)和查询(应用于 dbs)之间没有任何关系。
-
据此确实如此:msdn.microsoft.com/en-us/library/bb243806(v=office.12).aspx 但老实说,我从未真正深入研究过它或对其进行过多测试。
标签: sql-server-2005 ms-access dao synchronous