6

这应该很容易,但我还没有找到一个真正简洁的答案。我在 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中的返回值?在此先感谢,并对这个蹩脚的问题感到抱歉。

4

2 回答 2

5

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

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

请参阅该页面中的代码。

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

@NextSumID integer OUT

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

从存储过程返回数据:MSDN

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

theParameter.Direction = ParameterDirection.ReturnValue

此处 (MSDN)进一步讨论了此方法。

于 2013-07-25T21:26:09.640 回答
3

以下是使用返回值的存储过程获取返回值的方法。您需要参考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
于 2015-07-31T13:56:14.630 回答