【问题标题】:Access ADODB - Procedure or function has too many arguments specified访问 ADODB - 过程或函数指定了太多参数
【发布时间】:2019-10-07 01:52:42
【问题描述】:

我最近开始使用 ADODB 执行存储过程,但遇到了一些麻烦。每当我尝试运行这个特定的存储过程时,它都会给我一个错误:Run-time error '-2147217900 (80040e14)': [Microsoft][ODBC SQL Server Driver][SQL Server]Procedure or function CheckTeamMember has too many arguments specified. 但是,当我仔细检查 vba 中的调用和 sql server 中的 SP 时,它们都具有相同数量的参数,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

【问题讨论】:

  • 看起来应该可以工作,请仔细检查您是否连接到正确的数据库(或重命名 SP 并查看会发生什么)。您可以使用 SQL Profiler 工具来跟踪对服务器进行的确切调用。请注意,checkTeamMember = exists 假定 exists 变量已使用输出值进行更新 - 情况并非如此,要阅读它,您需要向 Paramaters 集合询问值:exists = cmdCheckTeamMember.Parameters("@exists").Value
  • 感谢您的推荐,我完全忘记了服务器分析器。从我所看到(并理解)的外观来看,我将输出 arg 设置为导致它出错的实际值。 @AlexK。

标签: sql-server vba ms-access adodb


【解决方案1】:

如果你想重复使用一个命令,你只需要添加一次参数。所以添加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

【讨论】:

  • 这行得通,谢谢。根据我对更改内容的理解,这是因为 1. 我的旧代码试图为输出参数提供一个值,并且 2. 每次我运行它都会添加更多参数。对吗?
  • 是的。您每次都在添加参数,而不是在 .Execute 之后检索输出参数的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-28
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多