1

我已经在SQL Server 2008 R2数据库与可选的输入参数的存储过程和一个像这样的输出参数:使用可选的输入参数,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 

当我在SSMS调用存储过程没有可选参数正常工作:

DECLARE @TicketID int 

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

但是,当我试图通过ADODB在ASP经典是这样一回事:

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.Connection包含此NativeError 8162:

“的正式参数\” @用户名\“未声明为OUTPUT参数 ,但在请求的输出传递的实际参数”

我使用ADODB来调用没有可选参数的存储过程。这是ADODB中的一个已知缺陷,还是我需要做一些特殊的事情来让它在有输出参数的情况下工作?

回答

3

原来the ADODB default是忽略参数名称,并简单地将它们传递到附加顺序的存储区。

因此,在给定的例子,@Ticket传递给存储过程作为@EmailAddress@UserID@Ticket获得通过,并没有输出参数,在所有获得通过!

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