【问题标题】:ADODB wait for query to complete before refreshing a different connectionADODB 在刷新不同的连接之前等待查询完成
【发布时间】:2014-05-05 17:39:07
【问题描述】:

我在 excel 中有一个表,它通过与 Access 数据库的连接来填充。我正在尝试编写一个允许您从该表中删除单个行的宏。我使用 ADODB 连接将删除命令传递给 Access,效果很好。但是,在宏结束时,我想在 excel 中刷新表格,以便在宏完成后,删除的记录将不再出现在该表中。

我已经在填充表的连接上设置了 backgroundquery = False,但在这种情况下似乎没有什么不同。我已使用 application.wait 命令作为解决方法,但我正在寻找更好的解决方案。在我的删除查询运行之前,还有其他方法可以推迟表刷新吗?

我的代码如下:

Sub Delete_recipe()

'Set up query
Dim Recipe_ID As Integer
    Worksheets("Recipe Adder").Calculate
    Recipe_ID = Range("New_recipe_ID").Value

'Open data connection
Dim Cn As ADODB.Connection
Set Cn = New ADODB.Connection
Cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Tucker\Desktop\Recipe project\MURPH.xls;Extended Properties=Excel 8.0;" _
& "Persist Security Info=False"

'Execute delete query
Cn.Execute "Delete from Recipe_master IN 'C:\Users\Tucker\Desktop\Recipe project\MURPH.accdb' where Recipe_ID =" & Recipe_ID
Cn.Execute "Delete from Recipe_ingredients IN 'C:\Users\Tucker\Desktop\Recipe project\MURPH.accdb' where Recipe_ID =" & Recipe_ID
Cn.Execute "Delete from Recipe_instructions IN 'C:\Users\Tucker\Desktop\Recipe project\MURPH.accdb' where Recipe_ID =" & Recipe_ID

'Close connection
Cn.Close
Set Cn = Nothing

'Application.Wait (Now + TimeValue("0:00:06"))
ActiveWorkbook.Connections("Murph Ingredient").Refresh

'Clear data from cells
Range("New_recipe_name_merged").ClearContents
Range("Recipe_description").ClearContents
Range("New_recipe_ingredients").ClearContents
Range("New_recipe_instructions").ClearContents

End Sub

感谢您的帮助

【问题讨论】:

    标签: excel vba adodb


    【解决方案1】:

    您需要异步执行并等待它完成。 请注意,如果您等待每个命令执行直到触发下一个命令,它会减慢您的速度。

    cn.Execute sqlString, , adAsyncExecute
    Do While cn.state = adStateOpen + adStateExecuting
        ' wait for command to finish
        ' perhaps show a status here
    Loop
    
    ActiveWorkbook.Connections("Murph Ingredient").Refresh
    

    我们必须检查每个State Property documentation 的状态组合

    您可以使用 State 属性来确定当前状态 任何时候给定的对象。对象的 State 属性可以有 价值观的组合。例如,如果一个语句正在执行,这 属性将具有组合值 adStateOpen 和 adStateExecuting。

    进一步阅读:

    【讨论】:

    • 感谢您的提示。我认为异步将是正确的方法,但我仍然不完全在那里。运行代码时,循环似乎没有等待上一个查询完成。我在执行开始后立即打印了 cn.state 值,它说状态为 5。 adStateExecuting 对应于 4,我在任何地方都找不到状态 5 的定义。当我尝试将您的查询更改为“Do While cn.state = 4”时,它遇到了与上述相同的问题,当我尝试“Do While cn.state = 5”时,它运行了整个代码,但仍然存在不刷新的问题连接
    • 哇。这很奇怪。 adStateClosed = 0, adStateOpen = 1, adStateConnecting = 2, adStateExecuting = 3, adStateFetching = 8...奇怪...
    • 好的。根据this doc state 属性可以有值的组合。不过,还不能 100% 确定这意味着什么。
    • @Tucker 我更新了我的答案。请尝试检查adStateOpen + adStateExecuting
    • 这是有道理的。我进行了更改,但刷新仍然存在问题。我现在在想我的问题不在于让访问及时执行代码。当我在代码和刷新之间添加断点时它会起作用,我认为这是一个时间问题,但可能不是。不知道下一步该去哪里,但如果我弄明白了会发布。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多