首页 > 解决方案 > 来自存储过程的 VBA 返回值“指定了太多参数”

问题描述

我有一个存储过程,它返回值 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并从那里开始。

标签: sqlsql-servervbams-access

解决方案


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

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

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


推荐阅读