【问题标题】:MS Access form opens before make table query finishesMS Access 表单在生成表查询完成之前打开
【发布时间】: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


【解决方案1】:

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

私有子Form_Load()

Me.Recordset = "SELECT * FROM TMPTABLE1"

结束子

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

【讨论】:

  • 我会将其标记为已接受,因为从技术上讲,这解决了我发布的特定问题。在没有生成表查询的情况下,我的访问程序的其他区域仍然存在问题,但我会重新发布一个更好的例子来说明我的整体问题。
  • 干杯 Micah,如果我看到帖子,我会看看你的其他问题
【解决方案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

【讨论】:

  • 在您的新编辑中,您正在删除 TMPTABLE1 但测试“_working_ReceivedMaterials”的可用性。这是否正确?另外,您正在执行的查询是创建访问表还是通过查询创建SQL-Server 表?在后一种情况下,您可能必须重新链接外部表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
相关资源
最近更新 更多