存储过程的VBA返回值“指定了太多参数”

时间:2019-06-17 09:23:58

标签: sql sql-server vba ms-access

我有一个存储过程,根据表中是否存在提供的Windows用户名,返回的值为0或1。

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

  

[Microsoft] [ODBC SQL Server驱动程序] [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,然后从那里返回。

1 个答案:

答案 0 :(得分:2)

通过访问服务器并读取过程的元数据来

.Parameters.Refresh populates Parameters集合。

然后,您手动添加相同的参数,最后以四个参数代替两个参数。

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

相关问题