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

时间:2009-05-06 12:19:59

标签: c# parameters datareader

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

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

...

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

期待一些智慧的宝石:)

5 个答案:

答案 0 :(得分:5)

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

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

希望这有帮助。

答案 1 :(得分:4)

获取输出参数的最简单方法是使用实​​例化变量。我的意思是保持对参数的引用,然后一旦执行了sproc,就可以像这样检查它们:

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

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

答案 2 :(得分:0)

这是亚音速失败,作为沼泽标准SQLConnection / Command

工作正常

答案 3 :(得分:0)

这里有点混淆......你期待标量值或某种记录集的输出吗?获得读者只有在你有例如才有意义一些光标作为参数返回...

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

答案 4 :(得分:0)

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

来自:This Page

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