Доступ к ADODB - в процедуре или функции указано слишком много аргументов - PullRequest
0 голосов
/ 20 мая 2019

Я недавно начал использовать ADODB для выполнения хранимых процедур, и я столкнулся с небольшим затруднением.Всякий раз, когда я пытаюсь запустить эту определенную хранимую процедуру, она выдает мне ошибку: Run-time error '-2147217900 (80040e14)': [Microsoft][ODBC SQL Server Driver][SQL Server]Procedure or function CheckTeamMember has too many arguments specified. Однако, когда я дважды проверяю как вызов в vba, так и SP на сервере sql, они оба имеют одинаковое количество аргументов, 3.

Вот SP:

CREATE PROC [dbo].[CheckTeamMember] (
    @projectID VARCHAR(45),
    @empID INT,
    @exists BIT OUTPUT
)
AS
    DECLARE @trueFalse BIT;

    SET @trueFalse = 0

    IF EXISTS (SELECT TOP 1 projectteammember_id FROM ci_projectteammember 
                    INNER JOIN ci_projectteam ON ci_projectteammember.projectteammember_team = ci_projectteam.projectteam_id 
                    WHERE ci_projectteam.projectteam_project = @projectID AND projectteammember_member = @empID)
    BEGIN
        SET @trueFalse = 1
    END
    ELSE
    BEGIN
        SET @trueFalse = 0
    END

    SELECT @exists = @trueFalse

Вот код в vba (это модуль класса. Я запускаю init () перед запуском фактической функции запроса):

Option Compare Database
Option Explicit

Private conDB As adodb.Connection
Private cmdCheckTeamMember As adodb.Command

Public Sub init(con As String)
    Set conDB = New adodb.Connection
    conDB.ConnectionString = con
    conDB.Open

    Set cmdCheckTeamMember = New adodb.Command

    With cmdCheckTeamMember
        .ActiveConnection = conDB
        .CommandType = adCmdStoredProc
        .CommandText = "CheckTeamMember"
        .Prepared = True
    End With

End Sub

Public Function checkTeamMember(projectID As String, empID As Integer) As Boolean

    Dim exists As Boolean

    With cmdCheckTeamMember
        .Parameters.Append .CreateParameter("@projectID", adVarChar, adParamInput, 45, projectID)
        .Parameters.Append .CreateParameter("@empID", adInteger, adParamInput, , empID)
        .Parameters.Append .CreateParameter("@exists", adBoolean, adParamInputOutput, , exists)
        .Execute
    End With

    checkTeamMember = exists

End Function

1 Ответ

1 голос
/ 20 мая 2019

Если вы хотите повторно использовать команду, вам нужно добавить параметры только один раз. Поэтому добавьте параметры в Init и получите доступ только к параметрам в ckdCheckTeammember. Что-то вроде:

Public Function checkTeamMember(projectID As String, empID As Integer) As Boolean

    Dim exists As Boolean

    With cmdCheckTeamMember
        .Parameters("@projectID").value = projectID
        .Parameters("@empID").value = empID

        .Execute

        exists = .Parameters("@exists").value 
    End With

    checkTeamMember = exists

End Function
...