4

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

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

...

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

期待一些智慧的宝石:)

4

5 回答 5

5

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

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

希望这可以帮助。

于 2010-11-16T05:19:12.293 回答
4

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

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();

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

于 2009-06-10T20:14:16.517 回答
0

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

于 2009-05-06T12:30:24.930 回答
0

这里有点困惑...您期望输出标量值还是某种记录集?只有当您有一些光标作为输出参数返回时,Get Reader 才会真正有意义......

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

于 2009-05-06T12:31:58.517 回答
0

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

来自:本页

  • 确保首先通过 cmd.ExecuteReader() 将记录集作为 SqlDataReader 检索到所有记录集,然后...
  • 确保在尝试检索输出参数之前通过 reader.Close() 关闭记录集或 SqlDataReader
于 2009-11-17T03:04:40.133 回答