Sql server ADODB是否在具有可选输入参数的输出参数上失败?

Sql server ADODB是否在具有可选输入参数的输出参数上失败?,sql-server,stored-procedures,asp-classic,adodb,output-parameter,Sql Server,Stored Procedures,Asp Classic,Adodb,Output Parameter,我在SQL Server 2008 R2数据库中有一个存储过程,其中有一个可选的输入参数和一个输出参数,如下所示: CREATE PROCEDURE [dbo].[spCreateTicket] ( @TrackingCode varchar(25), @EmailAddress varchar(250) = null, @Ticket varchar(1000), @UserID int, @TicketID int output ) AS SE

我在SQL Server 2008 R2数据库中有一个存储过程,其中有一个可选的输入参数和一个输出参数,如下所示:

CREATE PROCEDURE [dbo].[spCreateTicket]
(
    @TrackingCode varchar(25),
    @EmailAddress varchar(250) = null,
    @Ticket varchar(1000),
    @UserID int,
    @TicketID int output
)
AS
    SET NOCOUNT ON

    INSERT INTO dbTicket (TrackingCode, EmailAddress, Ticket, UserID)
        SELECT 
            @TrackingCode, @EmailAddress, @Ticket, @UserID

    SELECT @TicketID = SCOPE_IDENTITY()

    RETURN @TicketID
SET cmd = Server.CreateObject ("ADODB.Command")
cmd.ActiveConnection = HelpDeskConnection
cmd.CommandText = "spCreateTicket"
cmd.CommandType = adCmdStoredProc
cmd.Parameters.Append cmd.CreateParameter ("@TrackingCode",adVarChar,adParamInput,25,RandomString(25))
cmd.Parameters.Append cmd.CreateParameter ("@Ticket",adVarChar,adParamInput,1000,Ticket)
cmd.Parameters.Append cmd.CreateParameter ("@UserID",adInteger,adParamInput, ,Session("UserID"))
cmd.Parameters.Append cmd.CreateParameter ("@TicketID",adInteger,adParamOutput)
cmd.Execute
TicketID = cmd.Parameters("@TicketID")
在SSMS中调用不带可选参数的存储过程时,它可以正常工作:

DECLARE @TicketID int

EXEC [dbo].[spCreateTicket]
    @TrackingCode = 'xOCDUv289u403k5h24s5869vK',
    @Ticket = 'Something broke!',
    @UserID = 64307,
    @TicketID = @TicketID OUTPUT
但当我在ASP classic中通过ADODB尝试同样的事情时,如下所示:

CREATE PROCEDURE [dbo].[spCreateTicket]
(
    @TrackingCode varchar(25),
    @EmailAddress varchar(250) = null,
    @Ticket varchar(1000),
    @UserID int,
    @TicketID int output
)
AS
    SET NOCOUNT ON

    INSERT INTO dbTicket (TrackingCode, EmailAddress, Ticket, UserID)
        SELECT 
            @TrackingCode, @EmailAddress, @Ticket, @UserID

    SELECT @TicketID = SCOPE_IDENTITY()

    RETURN @TicketID
SET cmd = Server.CreateObject ("ADODB.Command")
cmd.ActiveConnection = HelpDeskConnection
cmd.CommandText = "spCreateTicket"
cmd.CommandType = adCmdStoredProc
cmd.Parameters.Append cmd.CreateParameter ("@TrackingCode",adVarChar,adParamInput,25,RandomString(25))
cmd.Parameters.Append cmd.CreateParameter ("@Ticket",adVarChar,adParamInput,1000,Ticket)
cmd.Parameters.Append cmd.CreateParameter ("@UserID",adInteger,adParamInput, ,Session("UserID"))
cmd.Parameters.Append cmd.CreateParameter ("@TicketID",adInteger,adParamOutput)
cmd.Execute
TicketID = cmd.Parameters("@TicketID")
它不执行任何操作,
@TicketID
为空,ADODB.Connection包含以下NativeError 8162:

“形式参数\@UserID\”未声明为输出 参数,但传入请求输出的实际参数。“

我一直使用ADODB调用不带可选参数的存储过程。这是ADODB中的一个已知缺陷,还是当有输出参数时,我需要做一些特殊的事情才能使它工作?

结果是忽略参数名,只需按照附加的顺序将它们传递给存储过程

因此,在给出的示例中,
@Ticket
作为
@EmailAddress
传递给存储过程,
@UserID
作为
@Ticket
传递,并且根本没有传递任何输出参数

如果希望ADODB按名称匹配参数,则必须设置ADODB.Command
.NamedParameters=True