Excel:使用 VBA 执行 SQL 过程——允许用户继续工作——不要挂起 Excel 应用程序

Posted

技术标签:

【中文标题】Excel:使用 VBA 执行 SQL 过程——允许用户继续工作——不要挂起 Excel 应用程序【英文标题】:Excel: Execute SQL Procedure with VBA -- allow user to continue working -- do not hang the Excel Application 【发布时间】:2019-05-15 17:03:11 【问题描述】:

我有几种从 Excel VBA 执行存储过程的方法。事实上,我什至没有兴趣将该程序的结果返回到 Excel,我只需要启动该程序。但是,当程序运行时 Excel “挂起”并且因为对客户不可用,尤其是当程序运行时间为 5 分钟或更长时间时。

我查看了人们在单个工作簿中实例化新应用程序的其他解决方案,但不清楚如何在该上下文中执行该过程。另一种解决方案是在后台打开第二个工作簿(对用户隐藏),并在该工作簿打开时自动运行宏,但我不清楚何时知道关闭它。

我用于调用该过程的代码,请注意,这存在超时问题,对此也有任何想法:

Sub Workbook_Open()

 'Create connection string variable
    Dim item As String
    Dim con As New ADODB.Connection

    'Build the connection string
    con.ConnectionString = "Provider=SQLNCLI11;" _
             & "Server=MyServerName;" _
             & "Database=Oracle;" _
             & "Integrated Security=SSPI;"

   'Open the connection
    con.Open

    item = vbNullString

    item = "exec dbo.SP_ORACLE_PULL"
    con.Execute (item)

   'Close the connection   
    con.Close

 End Sub

有人有推荐的方法吗?是否最好打开隐藏在后台的工作簿并从那里运行程序?我怎么知道何时关闭该工作簿并将状态转发回原始工作簿?是否仍然会“挂起”所有打开 Excel 工作簿的客户。我搜索了所有内容,但没有找到此类场景的任何代码示例。

这只是权宜之计,直到我们可以在 4 到 6 个月内正式确定一个更企业化的解决方案。

【问题讨论】:

与***.com/questions/17574524/adodb-query-timeout重复 ADODB query timeout的可能重复 @DougCoats 超时查询与异步运行命令有何关系?我会在this post 上提交答案作为欺骗目标......这基本上是蒂姆在下面回答的内容。 @MathieuGuindon b/c 我没有仔细阅读。或者 b/c 我是这么说的(尽管我试图玩弄它,但有一点 sass 一点用都没有)。 【参考方案1】:

如果您使用 WithEvents 声明连接等,ADO 支持异步操作

请参见此处,例如:https://support.microsoft.com/en-us/help/190988/how-to-open-ado-recordsets-asynchronously-using-withevents

【讨论】:

以上是关于Excel:使用 VBA 执行 SQL 过程——允许用户继续工作——不要挂起 Excel 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

VBA 将日期参数传递给 SQL Server 存储过程

为啥sql数据库的表用VBA导到EXCEL中的速度比EXCEL的数据导入功能慢

在 VBA 中使用 SQL 连接两个 Excel 工作簿中的数据(只读错误)

使用 VBA 将 Excel 表连接到 SQL Server

使用 VBA-Excel 跨多个数据库进行 SQL 查询

Excel VBA SQL 错误,连接失败