Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access MSAccess:异步运行存储过程,返回-语法?_Ms Access_Vba - Fatal编程技术网

Ms access MSAccess:异步运行存储过程,返回-语法?

Ms access MSAccess:异步运行存储过程,返回-语法?,ms-access,vba,Ms Access,Vba,我在过去运行单线程SPs时取得了很好的成功,使用以下命令等待“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_Databa

我在过去运行单线程SPs时取得了很好的成功,使用以下命令等待“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
但我不清楚此表单中用于确定返回标志的正确语法。我的尝试返回了一个“序号”错误


建议?

根据您的具体配置,您可以非常轻松地返回参数

假设您有以下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
如果cmd.State正在执行,则
returnValue=cmd.Parameters(“@Param1”)。完成后,Value'返回5
如果结束
'由于全局范围,需要进行清理
关闭连接
设置连接=无
Set cmd=Nothing

可能重复@June7,但无法回答如何异步执行。从异步运行的存储过程返回一个值要复杂得多。更复杂或不可能。我唯一能找到的就是安卓系统,当然不是不可能的。从异步调用的过程返回值可能有点琐碎,这可能就是为什么没有太多关于它们的答案,但是VBA并没有真正做异步的事情,所以这里也没有太多关于它的信息。我会看看我是否有时间写下来,然后测试答案。我在这个问题上做了一个小小的作弊。SP在FTP站点上创建一个临时文件,该文件在SP完成之前被删除。我正在测试临时文件的存在——当我发现它丢失时,我认为SP完成了。不太理想,但通过目前为止的测试,无论大小文件,似乎都是可靠的。Eric,谢谢你的提纲。我不清楚最后一个“独立功能”部分。这是在调用SP的函数的外部,对吗?我不确定第二个函数如何在-scope中包含这些变量。是的,在函数结束后,需要全局变量来持久化命令。这有用吗?