存储过程输出参数+选择不传回输出参数

Posted

技术标签:

【中文标题】存储过程输出参数+选择不传回输出参数【英文标题】:Stored proc Output parameter + Select not passing back output parameter 【发布时间】:2009-05-06 12:19:58 【问题描述】:

我有一个存储过程,它返回我使用 GetReader 调用的两个记录集。我迭代第一个,调用 IDataReader.NextResult(),然后迭代第二个。

我在sp中为输出参数赋值,但是当我用阅读器完成后检查值时,我的输出参数为空。看起来像一个错误。我不想使用选择,因为我不喜欢软糖。一些sn-ps...

...

sp.Command.AddParameter("@SelectedTabID", selectedTabID, DbType.Int32);
sp.Command.AddParameter("@CurrentTabID", 0, DbType.Int32, ParameterDirection.Output);
sp.Command.AddParameter("@TypeID", 0, DbType.Int32, ParameterDirection.Output);

(注意这样做或使用 AddOutputParameter() 会产生相同的结果)

...

using(IDataReader reader = sp.GetReader())

  while (reader.Read()) ...
  if (reader.NextResult()) while (reader.Read()) ...


...

int one = (int)sp.OutputValues[0]; //null expected an int
int two = (int)sp.OutputValues[1]; //null expected an int

期待一些智慧的宝石:)

【问题讨论】:

RDBMS、SQL Server、Oracle、DB2、mysql、. . . ? SQL Server 2005 与 Subsonic 【参考方案1】:

您需要先关闭阅读器,然后检索输出参数。阅读器打开时,输出参数返回 null。

更多信息可以在这里找到 http://amilagm.com/2010/11/output-variable-values-not-returned-from-sql-server-sp-in-c-sharp/

希望这会有所帮助。

【讨论】:

【参考方案2】:

获取输出参数的最简单方法是使用实​​例化变量。我的意思是保留对您的参数的引用,然后在执行存储过程后,您可以像这样检查它们:

SqlCommand cmd = new SqlCommand();
cmd.Connection = ConfigurationManager.ConnectionStrings["MyCon"].ToString();
cmd.CommandText = "MySproc";

SqlParameter parmOut = new SqlParameter("@StuffIWant", SqlDbType.Int);
parmOut.Direction=ParameterDirection.Output; 

cmd.Parameters.Add(parmOut);
cmd.ExecuteNonQuery();

string theThingIWant = parmOut.Value.ToString();

这可能没有使用数据读取器,但您可以使用它来找到正确的答案。 祝你好运。

【讨论】:

【参考方案3】:

这里有点困惑...您希望输出标量值还是某种记录集?获取阅读器只有在你有例如时才真正有意义。一些光标作为输出参数返回...

您可能希望在命令上调用“ExecuteNonQuery()”并确保正确设置 CommandType (CommandType.StoredProcedure)

【讨论】:

SP 执行:从某处选择 @p1 = somevalue, @p2 = othervalue 从查询 1 中选择 a,b,c 其中 somevalue = @p1 从查询 2 中选择 x,y,z 其中 someothervalue = @ p2 ...我想打扰结果集和两个参数使用 InputOutput 作为类型解决了这个问题。【参考方案4】:

这是亚音速失败,可以作为标准 SQLConnection/Command 正常工作

【讨论】:

【参考方案5】:

答案是你必须先关闭阅读器才能访问输出参数。

发件人:This Page

确保首先将记录集作为 SqlDataReader 检索 通过 cmd.ExecuteReader() 进程 通过所有记录集,然后... 确保关闭记录集, 或 SqlDataReader 通过 reader.Close() 在尝试检索输出参数之前

【讨论】:

以上是关于存储过程输出参数+选择不传回输出参数的主要内容,如果未能解决你的问题,请参考以下文章

在MySQL中如何创建一个带输出参数为一个表类型的存储过程

在PLSQL中,存储过程的输出参数最大支持多大

oracle存储过程输入参数能否为空

如何使用多个输出参数执行存储过程?

临时表作为存储过程中的输出参数

使用输出参数执行存储过程?