【问题标题】:VBA return value from Stored Procedure "has too many arguments specified"来自存储过程的 VBA 返回值“指定了太多参数”
【发布时间】:2019-10-30 21:01:13
【问题描述】:

我有一个返回值 0 或 1 的存储过程,具体取决于提供的 Windows 用户名是否存在于表中。

我添加了 VBA 来执行存储过程并处理返回值,因此我可以将其用作变量,但代码在 Execute 阶段失败:

[Microsoft][ODBC SQL Server Driver][SQL Server]过程或函数“x01_sl_getUserExists”指定的参数过多。

这里简化的存储过程:

USE [Database]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[Procedure] 
    @windowsAD nvarchar(50)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @usrStatus int

    SELECT @usrStatus = COUNT(1) FROM [SYS_Login] as lgn WHERE lgn.[SYS_LoginAD] = @windowsAD;

    RETURN @usrStatus
END

要在此处执行并返回的 VBA 代码:

Dim db As ADODB.Connection
Dim pr As ADODB.Parameter
Dim pr2 As ADODB.Parameter
Dim sp2 As ADODB.Command
Dim usrStatus as Integer

Set db = New ADODB.Connection
Set sp2 = New ADODB.Command
Set pr = sp2.CreateParameter("ReturnValue", adInteger, adParamReturnValue)
Set pr2 = sp2.CreateParameter("@windowsAD", adVarChar, adParamInput, 50, getUserID)

With sp2
    .CommandText = "Procedure"
    .CommandType = adCmdStoredProc
    .ActiveConnection = db
    .Parameters.Refresh
    .Parameters.Append pr
    .Parameters.Append pr2
End With

sp2.Execute '// CODE FAILS HERE
usrStatus = sp2.Parameters("@return_value")

基本上我想获得 0(用户不存在)或 1(用户确实存在)的 RETURN 值,因此我可以将其分配给变量 usrStatus 并从那里开始。

【问题讨论】:

    标签: sql sql-server vba ms-access


    【解决方案1】:

    .Parameters.Refresh populates Parameters 集合通过转到服务器并读取过程的元数据。

    然后您手动添加相同的参数,最终得到四个参数而不是两个。

    要么删除Refresh,要么不手动创建参数。

    【讨论】:

    • 另外,在创建/使用返回值参数时,将其称为“ReturnValue”或“@return_value”,但不能同时使用。
    • 感谢@GSerg 的快速响应——成功了!我不知道Parameters.Refresh 这样做了;我认为它清除了参数。再次感谢。
    • 只是添加@GSerg - 它们都被称为@return_value,但我必须在编辑示例时错误地修改了其中一个以在此处发布。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多