【问题标题】:MSAccess: Run Stored Proc Asynchronously w/Return - Syntax?MSAccess:异步运行存储过程并返回 - 语法?
【发布时间】:2019-03-20 16:40:45
【问题描述】:

我在过去运行单线程 SP 方面取得了很好的成功,等待“0”或“-1”回复表示成功,使用:

Set cnn = New ADODB.Connection
cnn.CursorLocation = adUseClient
cnn.ConnectionString = "driver={SQL Server};server=" & TempVars!my_ip & ";Trusted_Connection=no;Database=" & TempVars!my_Database & ";UID=username;PWD=password"
cnn.CommandTimeout = 0
cnn.Open

strSQL = "ExportToCSVZip 'myTable', '\\192.168.242.147\InventoryProcessing\Exports\', 'ProdCIVProcess', 'Y';"

Set rs = cnn.Execute(strSQL)

'SP Result -1 = Success, 0 = Fail
If rs.Fields(0) = -1 Then
    msgbox "Done"
Else
    msgbox "Fail"
End If

我可以使用以下方式异步运行:

cnn.Execute strSQL, adExecuteNoRecords, adAsyncExecute

但我不清楚这种形式的正确语法来确定返回标志。我的尝试返回了一个“序数”错误。

建议?

【问题讨论】:

  • @June7 这没有回答如何异步执行。从异步运行的存储过程返回值要复杂得多。
  • 更复杂或不可能。我唯一能找到的涉及Android stackoverflow.com/questions/15739635/…
  • 当然不是不可能。从异步调用的过程中返回值可能有点微不足道,这可能就是为什么没有很多关于它们的答案的原因,但是 VBA 并没有真正做异步的东西,所以这里也没有太多关于它的信息。稍后我会看看我是否有时间写下并测试答案
  • 我已经设法解决了这个问题。 SP 在 FTP 站点上创建一个临时文件,该文件在 SP 完成之前被删除。我正在测试临时文件是否存在 - 当我发现它丢失时,我认为 SP 已完成。不理想,但到目前为止,通过测试大小文件似乎可靠。

标签: ms-access vba


【解决方案1】:

根据您的具体配置,您可以很容易地返回参数。

假设你有以下 SP:

CREATE PROCEDURE TestSP 
    @Param1 INT OUT
AS
    WAITFOR DELAY '00:00:03';
    SET @Param1 = 5;

然后,在你的模块中全局声明:

Dim conn As ADODB.Connection
Dim cmd As ADODB.Command

然后,在你的函数中:

Set cnn = New ADODB.Connection
cnn.Open = "Some connectionstring"
Set cmd = New ADODB.Command
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "TestSP"
Dim p As ADODB.Parameter
Set p = cmd.CreateParameter("@Param1", adInteger, adParamOutput, 8)
cmd.Parameters.Append p
Set cmd.ActiveConnection = conn
cmd.Execute Options:=adAsyncExecute

然后,在一个单独的函数中,测试命令是否完成,如果完成则返回值

If cmd.State <> adStateExecuting Then
      returnValue = cmd.Parameters("@Param1").Value 'Returns 5 when done
End If
'Because of the global scope, cleanup is required
conn.Close
Set conn = Nothing
Set cmd = Nothing

【讨论】:

  • 艾瑞克,感谢您的提纲。我不清楚最后一个“单独的功能”部分。这是首先调用 SP 的函数的外部,对吗?我不确定第二个函数如何将这些变量包含在范围内。
  • 是的,函数结束后需要全局变量来持久化命令。这行得通吗?
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2021-01-19
  • 2014-10-15
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多