Sql server 当MSSQL存储过程用int填充ADODB命令输出参数时,为什么ADODB命令输出参数为null?

Sql server 当MSSQL存储过程用int填充ADODB命令输出参数时,为什么ADODB命令输出参数为null?,sql-server,stored-procedures,vbscript,asp-classic,adodb,Sql Server,Stored Procedures,Vbscript,Asp Classic,Adodb,我有一个MSSQL存储过程,它显式地将输出参数设置为一个值。但是,当我使用ADODB命令从经典ASP页面执行该存储过程时,输出参数为null 存储过程: ALTER过程[dbo].[recordResponse] @测量id smallint输出, @成员id varchar(10)输出, @响应varchar(1000)输出, @注释varchar(1000)输出, @响应\u id int输出, @时间戳日期时间输出, @状态整型输出 作为 开始 不计数; 设置@timestamp=getd

我有一个MSSQL存储过程,它显式地将输出参数设置为一个值。但是,当我使用ADODB命令从经典ASP页面执行该存储过程时,输出参数为null

存储过程:

ALTER过程[dbo].[recordResponse]
@测量id smallint输出,
@成员id varchar(10)输出,
@响应varchar(1000)输出,
@注释varchar(1000)输出,
@响应\u id int输出,
@时间戳日期时间输出,
@状态整型输出
作为
开始
不计数;
设置@timestamp=getdate();
将@surveyExists声明为二进制
从survey_id=@survey_id的调查中选择@surveyExists=1;
如果(@surveyExists=1)
开始
插入
响应(成员、[时间戳]、响应、评论、调查id)
值(@member\u id、@timestamp、@response、@comment、@survey\u id);
设置@response_id=SCOPE_IDENTITY();
设置@status=200;
结束
其他的
设置@status=400;
结束
经典ASP:

Set cmd=Server.CreateObject(“ADODB.Command”)”启动命令对象
cmd.CommandType=4'存储过程
cmd.CommandText=“recordResponse”'存储过程的名称
cmd.ActiveConnection=connString'使用哪个连接?
'添加参数
cmd.Parameters.Append cmd.CreateParameter(“@survey_id”,2,3,0,1)
cmd.Parameters.Append cmd.CreateParameter(“@member_id”,200,3,10,memberNo)
cmd.Parameters.Append cmd.CreateParameter(“@response”,200,3,1000,answer)
cmd.Parameters.Append cmd.CreateParameter(“@comment”,200,3,1000,comment)
cmd.Parameters.Append cmd.CreateParameter(“@response_id”,2,2)
cmd.Parameters.Append cmd.CreateParameter(“@timestamp”,135,2)
cmd.Parameters.Append cmd.CreateParameter(“@status”,3,2)
'执行存储过程
调用cmd.Execute()
Response.write“[”&cmd(“@status”)和“]
这将导致输出
[]
,而我预期的输出是
[200]
[400]

我研究了各种其他建议和解决方案,包括迭代生成的记录集,但没有一个解决了我的问题

有人知道我哪里出错了吗?

请再试一次

cmd.Parameters["@status"].Value

创建参数的设置如下所示。 在ADO中设置objparameter=objcommand.CreateParameter(名称、类型、方向、大小、值)

请正确设置参数、类型、方向和尺寸

  Response.write "[" & cmd.Parameters("@status").Value & "]"

我发现了问题:我对参数
@response\u id
使用了错误的数据类型。我有
adSmallInt
(2),而它应该是
adInteger
(3),以匹配存储过程中声明的数据类型。MSSQL抛出异常,但我的ASP脚本指定了“错误恢复下一步”时的
,该脚本正在默默地接受错误。因此,脚本运行,SP执行了
INSERT
语句,但无法设置
@status
参数,但脚本仍在运行。一旦我在错误恢复下一步中注释掉
,我就可以看到异常并找到罪魁祸首


无论如何,谢谢你的建议。非常感谢

我个人使用
cmd.Parameters.Refresh
从进程加载参数定义。例如,应该正确设置输出属性(在您的情况下,您没有这样做)@Nick.McDermaid:这会导致服务器往返:我不建议使用它。另外:“如果使用刷新方法从提供程序获取参数信息,并且返回一个或多个可变长度数据类型参数对象,ADO可能会根据参数的最大潜在大小为参数分配内存,这将在执行过程中导致错误。”。“:你的观点很好。开发人员必须在数据库和应用程序中分别定义参数(并了解参数零,即返回值,以及输出参数技巧),这两点是平衡的。无论如何,我相信你已经在下面的回答中解决了根本问题
Refresh
当然对一次性元数据发现也很有帮助——如果您想对参数进行编码,您可以知道参数应该是什么样子。我不知道
cmd.parameters.Refresh
方法。听起来很方便!还提到了很好的警告。行
cmd.Parameters.Append cmd.CreateParameter(“@status”,3,2)
是否已经在这样做了?文档中说第一个参数是name,然后是type,然后是direction&Value。在上面的例子中,第一个参数是正确的,但是第二个参数应该是类型。检查这个哦,我现在明白你的意思了。我使用的是枚举值,而不是标签。值3映射到adInteger的标签,每。类似地,对于direction参数,根据,值2映射到adParamOutput的标签。您还应该尝试将“return”放在过程的末尾。谢谢。我尝试过这个,但仍然得到一个空值。同样,这是.Net中的c#语法,或者是使用JScript的Classic ASP,而不是使用VBScript的Classic ASP。非常常见,并且已经涵盖了多个问题。我用于检查数据类型的有用资源是,多次帮助我。谢谢。我知道有人问过类似的问题,我想我已经研究过了所有的问题!但是没有人给我指出这个问题的正确方向。大多数人谈到在访问输出参数之前检索所有记录集,而其他人则谈到为您感兴趣的参数选择正确的数据类型。没有人建议检查是否正在使用“错误恢复下一步时的
,因为可能会发生异常,导致输出参数永远无法设置。@MattP这是因为您使用了“枚举值而不是标签”。