我在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
但是当我在ASP经典中通过ADODB尝试同样的事情时:
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:
"形式参数\" @UserID \"未被声明为OUTPUT 参数,但在请求的输出中传递的实际参数。"
我使用ADODB一直调用没有可选参数的存储过程。这是ADODB中的一个已知缺陷,还是我需要做一些特别的事情才能让它在有输出参数的情况下工作?
答案 0 :(得分:4)
结果the ADODB default是忽略参数名称,只是按照附加的顺序将它们传递给sproc。
因此,在给出的示例中,@EmailAddress
作为@UserID
传递给sproc,@Ticket
作为.NamedParameters = True
传递,并且根本没有传递输出参数!
如果您希望ADODB按名称匹配参数,则必须设置ADODB.Command ListObject.Unlink
。