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

slo*_*ife 4 sql-server ado asp-classic

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

我继承了这个代码并且它被破坏了,我将尝试重新创建相关的部分.如果您需要更多细节或我遗漏了一些东西,请告诉我.

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

oCmd.CommandType = adCmdStoredProc
...
oCmd.Parameters.Append oCmd.CreateParameter("@MyOutputParam", adInteger, adParamOutput, 4, NULL)
Run Code Online (Sandbox Code Playgroud)

后来,我从该命令打开一个阅读器:

oRS.Open oCmd, , adOpenForwardOnly, adLockReadOnly
Run Code Online (Sandbox Code Playgroud)

此后,在ORS是开放的,但我读过的任何记录或值之前,我尝试使用,以获得输出参数的值一个低于行:

val1 = oCmd("@MyOutputParam")
val2 = oCmd("@MyOutputParam").Value
val3 = oCmd.Parameters("@MyOutputParam").Value
Run Code Online (Sandbox Code Playgroud)

所有三个(val1,val2,val3)变量都是DB NULL.

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

declare @p33 int
exec usp_GetResultAndOutput 1, 2, 3, @p33 output
select @p33
Run Code Online (Sandbox Code Playgroud)

返回我的预期记录的记录集和第二个记录集,显示单行中的数字.

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

还有其他方法需要处理输出参数吗?

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

Rem*_*anu 5

在枚举所有记录集直到结束之前,无法检索输出参数.试想一下,客户端如何在执行完成之前检索参数的输出值?该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")
Run Code Online (Sandbox Code Playgroud)

  • 在最后一个记录集上调用`NextRecordset()`之前,绝对不要访问返回和输出参数(甚至出于调试目的!)。否则,它们将在最后一次调用`NextRecordset()`之后保持为空(`vbEmpty`!),并且不包含真实值! (2认同)