【问题标题】:Assign a stored procedure return value to a VBA variable将存储过程返回值分配给 VBA 变量
【发布时间】:2013-07-25 23:07:56
【问题描述】:

这应该很容易,但我还没有找到一个真正简洁的答案。我在 sql server 中有一个非常简单的存储过程,它返回一个整数值。我要做的就是将该返回值放入一个变量中以在 Access 中使用。

存储过程:

ALTER PROCEDURE [dbo].[out_GetNextID]
@NextSumID integer
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
SELECT @NextSumID = IDENT_CURRENT('Outage Summary')+IDENT_INCR('Outage Summary')
RETURN @NextSumID
END

我正在使用ADODB来执行存储过程,我不得不问这个我觉得很愚蠢,但是我运行cmd.Execute后如何访问Access中的返回值?在此先感谢,对于这个蹩脚的问题,我们深表歉意。

【问题讨论】:

    标签: sql-server vba ms-access stored-procedures


    【解决方案1】:

    有两种方法,使用输出参数或设置ReturnValue(下文讨论)。对于 OUTPUT 参数,引用此SO link

    本质上你只需要创建一个SqlParameter,设置Direction 输出,并将其添加到 SqlCommand 的参数集合。然后 执行存储过程,获取参数值。

    查看该页面的代码。

    但是,您还需要在变量声明中包含单词 OUT(或 OUTPUT):

    @NextSumID integer OUT
    

    当您将变量声明为 OUT(或 OUTPUT)时,它将自动返回,无论过程完成时它具有什么值,因此您可以使用 RETURN。

    Return Data from a Stored Procedure :MSDN

    您可以改为使用RETURN @NextSumID,因为您只返回一个整数值。对于这种方法,您需要将参数指定为ReturnValue

    theParameter.Direction = ParameterDirection.ReturnValue
    

    此方法将进一步讨论here (MSDN)

    【讨论】:

    • 感谢您的回复。我决定放弃RETURN @NextSumID 而只使用RETURN,因为我缺少的关键部分只是通过NextID = cmd.Parameters("@NextSumID") 分配变量。我不知道为什么我很难弄清楚这一点。
    • 我也花了一段时间来整理我的答案的信息;)
    • 我觉得好像应该有一些更好的文档/示例用于存储过程输出变量的基本用法。很容易找到人们正在更新记录集之类的情况,但不是很多简单的使用情况。希望这可以帮助与我遇到类似困境的其他人。
    【解决方案2】:

    以下是使用返回值的存储过程获取返回值的方法。您需要参考 Microsoft ActiveX Data Objects 2.8 Library

    Sub CheckValue(ByVal NextSumID As Long)
    
        'open connnection
        Dim ACon As New Connection
        ACon.Open ("Provider=SQLOLEDB;Data Source=<SqlServer>;" & _
            "Initial Catalog=<Table>;Integrated Security=SSPI")
    
        'set command
        Dim ACmd As New Command
        Set ACmd.ActiveConnection = ACon
        ACmd.CommandText = "out_GetNextID"
        ACmd.CommandType = adCmdStoredProc
    
        'Return value must be first parameter else you'll get error from too many parameters
        'Procedure or function "Name" has too many arguments specified.
        ACmd.Parameters.Append ACmd.CreateParameter("ReturnValue", adInteger, adParamReturnValue)
        ACmd.Parameters.Append ACmd.CreateParameter("NextSumID", adVarChar, adParamInput, 10, NextSumID)
    
        'execute query
        Call ACmd.Execute
    
        'get return value
        Debug.Print "Return value: " & ACmd.Parameters("ReturnValue")
    
        ACon.Close
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-22
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多