需要从Access记录集中的SQL过程获取返回值

时间:2013-07-16 07:55:20

标签: sql-server-2008 ms-access ms-access-2007 access-vba recordset

我是Access的新手,我被困在记录集中。我正在使用正确的连接字符串从Access运行过程。程序运行得非常好。

Set con = New ADODB.connection  
Set rs = New ADODB.Recordset  
con.Open "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"                // Connection string.  
rs.Open "Exec [stored procedure] 'parameter' ", con, adOpenDynamic, adLockOptimistic  

SQL中的这个存储过程在失败和成功的基础上返回两个值0和1(它告诉过程的状态)。

现在我的问题是如何在访问中获取此值,以便我可以向用户显示状态。

2 个答案:

答案 0 :(得分:1)

听起来您的存储过程实际上只返回一个值,该值将为0或1.这通常称为标量值(单个值而不是一组值或一组值)。

您还需要将参数传递给存储过程。这通常称为参数化查询。您可能知道,可以编写不使用参数的存储过程。

Set con = New ADODB.connection  
Set rs = New ADODB.Recordset
rs.CursorType = adOpenForwardOnly
rs.LockType = adLockReadOnly
con.Open "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" '// Connection string.

Dim cmd as New ADODb.Command
cmd.CommandTimeout = 5
cmd.ActiveConnection = con
cmd.CommandText = "SQL GOES HERE"
cmd.CommandType = acCmdStoredProc

Dim param
Set param = cmd.CreateParameter("@productid", adInteger, adParamInput, 0, 0)
cmd.Parameters.Append param
cmd.Parameters("@productid") = 15 'Return the product with ProductID = 15

Set rs = cmd.Execute
'or use:
'rs.Open cmd
Debug.Print rs(0)

rs.close
Set rs = Nothing
Set cmd = Nothing
con.close
Set con = Nothing

微软有一篇关于此的文章。它是使用VBScript编写的,但可以很容易地适应VBA。 http://support.microsoft.com/kb/200190

你也可以在SO上看到这个:
How to access SQL Server scalar functions in MS Access VB

答案 1 :(得分:0)

调用存储过程时,第一个参数是返回值。

' Set up a return parameter.
Set prm = .CreateParameter("Return", adInteger, adParamReturnValue)
.Parameters.Append prm
 ' Set up an input parameter.
Set prm = .CreateParameter("Id", adInteger, adParamInput, , lid)
.Parameters.Append prm
' Set up an output parameter.
Set prm = .CreateParameter("Output", adInteger, adParamOutput)
.Parameters.Append prm

' Execute command, and loop through recordset, printing out rows.
.Execute , , adExecuteNoRecords
If .Parameters("Return") = 0 Then
    lid = Nz(.Parameters("Output").Value, 0)
    If lid <> 0 Then AdoSingleId = True
Else
    lid = .Parameters("Return")
End If