Выходит ли ADODB из строя на выходных параметрах с дополнительными входными параметрами?


У меня есть хранимая процедура в базе данных 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

Когда я вызываю хранимую процедуру без необязательного параметра в SSMS, она работает нормально:

DECLARE @TicketID int

EXEC [dbo].[spCreateTicket]
    @TrackingCode = 'xOCDUv289u403k5h24s5869vK',
    @Ticket = 'Something broke!',
    @UserID = 64307,
    @TicketID = @TicketID OUTPUT

Но когда я пробую то же самое через ADODB в ASP classic, как это:

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 остается Empty, и ADODB.Соединение содержит этот NativeError 8162:

"формальный параметр " @UserID" не был объявлен в качестве выходного параметр, но фактический параметр, переданный в запрошенном выводе."

Я использую ADODB для вызова хранимых процедур без дополнительных параметров все время. Является ли это известным дефектом в ADODB, или мне нужно сделать что-то конкретное, чтобы заставить его работать, когда есть выходной параметр?

1 2

1 ответ:

Оказывается по умолчанию ADODB игнорирует имена параметров и просто передает их в sproc в порядке добавления.

Следовательно, в приведенном примере @Ticket было передано в sproc как @EmailAddress, @UserID был передан как @Ticket, и ни один выходной параметр не был передан вообще!

Если вы хотите, чтобы ADODB соответствовал параметрам по имени, вы должны установить ADODB.Команда .NamedParameters = True.