Sql server 为什么adParamOutput参数在执行后不包含值

Sql server 为什么adParamOutput参数在执行后不包含值,sql-server,asp-classic,ado,Sql Server,Asp Classic,Ado,我正在使用ASP经典与ADO,连接到SQL Server 2008 我继承了这段代码,它是如此的混乱,我将尝试重新创建相关的部分。如果你需要更多的细节或者我遗漏了什么,请告诉我 我创建一个命令并添加参数 oCmd.CommandType = adCmdStoredProc ... oCmd.Parameters.Append oCmd.CreateParameter("@MyOutputParam", adInteger, adParamOutput, 4, NULL) 稍后,我将从该命令打开

我正在使用ASP经典与ADO,连接到SQL Server 2008

我继承了这段代码,它是如此的混乱,我将尝试重新创建相关的部分。如果你需要更多的细节或者我遗漏了什么,请告诉我

我创建一个命令并添加参数

oCmd.CommandType = adCmdStoredProc
...
oCmd.Parameters.Append oCmd.CreateParameter("@MyOutputParam", adInteger, adParamOutput, 4, NULL)
稍后,我将从该命令打开一个读卡器:

oRS.Open oCmd, , adOpenForwardOnly, adLockReadOnly
之后,当oRS打开时,但在读取任何记录或值之前,我尝试使用以下行之一获取输出参数的值:

val1 = oCmd("@MyOutputParam")
val2 = oCmd("@MyOutputParam").Value
val3 = oCmd.Parameters("@MyOutputParam").Value
所有三个val1、val2和val3变量都是DB NULL

我已经确认,在查询分析器中运行SP会向@MyOutputParam参数返回一个值:

declare @p33 int
exec usp_GetResultAndOutput 1, 2, 3, @p33 output
select @p33
它返回一个预期记录的记录集和一个显示单行中数字的第二个记录集

在尝试获取输出参数之前,我甚至尝试调用rs.NextRecordset,但没有成功

我是否需要以其他方式处理输出参数


返回记录集和输出参数可以吗?

就我所能测试的而言,唯一重要的是游标位置。只要游标位置设置为adUseClient 3,就可以在执行后随时访问输出参数。以下任何一项都可以做到这一点

oConn.CursorLocation = adUseClient


这在Windows 7上的SQL 2008 R2、IIS/ASP和SQLOLEDB提供程序上进行了测试。

在枚举所有记录集之前,无法检索输出参数。试想一下,客户机怎么可能在执行完成之前检索参数的输出值呢?Execute调用只是开始执行,批处理继续在服务器上执行,直到返回所有结果。当客户机在SELECT生成的结果集上迭代时,批处理正在执行该SELECT。输出参数的值仅在批处理结束时已知。因此,在批处理完成之前,不可能知道输出参数值,这意味着所有语句都已执行,而这反过来又要求客户端迭代使用所有结果集

这是解析一组结果的标准形式:

do
{
  while (rs.MoveNext)
  {
    // do something with the row
  }
} while (Not rs.NextRecordset Is Nothing)
// now is safe to read the out param
response.write oCmd("@MyOutput")

有没有办法为创建的记录集指定adLockReadOnly和adOpenForwardOnly?我正在查看,但它没有说有。这些是默认值,所以应该可以。将其更改为oCmd。Execute未工作输出参数在executeIt之后仍然为空。在我调用oRS.NextRecordset以通过所有记录集之前,输出参数似乎不可用。但是,如果我循环遍历第一个记录集中的每个记录,我仍然无法在.nextRecordSet之后获得输出参数。我想这是有意义的,尽管似乎许多人希望在结果集之前使用输出参数:但即使有了这些知识,它对我也不起作用。我尝试在获取参数之前调用.NextRecordset.Close,或者在循环查看结果之后调用它。什么都不管用。还有其他想法吗?你确定你参与了所有的记录集吗?NextRecordset调用是否返回false?在返回false之前,您需要继续迭代。是的,我在之后添加了一些测试代码。Execute使用.MoveNext循环遍历每个记录。我尝试在那里获取参数,然后关闭记录集并获取参数,或者调用.NextRecordset并获取参数。参数的All返回NULL。请参见“我的编辑”,您必须迭代所有结果集中的所有行,您的解释中不清楚您是否这样做。在调用最后一个记录集上的NextRecordset之前,绝对不要访问返回和输出参数,这是非常重要的,即使是出于调试目的!。否则,它们将保持为空!在最后一次调用NextRecordset后,不包含真值!
do
{
  while (rs.MoveNext)
  {
    // do something with the row
  }
} while (Not rs.NextRecordset Is Nothing)
// now is safe to read the out param
response.write oCmd("@MyOutput")