存储过程在C#与SQL Server中返回不同的值

时间:2014-01-08 15:44:37

标签: c# sql sql-server stored-procedures sql-server-2012

我有一个带参数@id int OUTPUT的存储过程(sql server 2012) 该过程向数据库表中插入一些数据并返回受影响行的ID

SET @id=SCOPE_IDENTITY()
RETURN @id

我从SQL Server测试它,它工作正常。但是当我从C#调用它时:它确实将数据插入到表中,但返回null:

SqlParameter parm = new SqlParameter("@id", SqlDbType.Int);
parm.Size = 32;
parm.Direction = ParameterDirection.Output; // This is important!
cmd.Parameters.Add(parm);
object id = (int?)cmd.ExecuteScalar();//<-null

请指出导致这种奇怪行为的原因是什么?

4 个答案:

答案 0 :(得分:6)

ID的值存储在Output参数中,可以在执行查询后读取。

SqlParameter parm = new SqlParameter("@id", SqlDbType.Int);
parm.Size = 32;
parm.Direction = ParameterDirection.Output; // This is important!
cmd.Parameters.Add(parm);
cmd.ExecuteNonQuery();
object id = (int)cmd.Parameters["@id"].Value;

或者您可以将查询本身更改为

的最后一行
SELECT SCOPE_IDENTITY()

从ExecuteScalar中获取值(在这种情况下无需传递ID参数)

object result = cmd.ExecuteScalar();
if(result != null) 
    id = Convert.ToInt32(result);

答案 1 :(得分:1)

您可以获得返回值

 parm.Direction = ParameterDirection.ReturnValue;
 cmd.Parameters.Add(parm);
 cmd.ExecuteNonQuery();
 var id = (int?)parm.Value;

答案 2 :(得分:1)

SqlParameter param = new SqlParameter("id", SqlDbType.Int);
param.Direction = ParameterDirection.ReturnValue;
cmdHeader.Parameters.Add(param);

    //   Execute your command
cmdHeader.ExecuteNonQuery();

    //   Get the return value
int returnvalue = (int)myCommand.Parameters["id"].Value;

答案 3 :(得分:1)

关键部分位于docs

  

执行查询,并返回第一行的第一列   查询返回的结果集

即。 ExecuteScalar不返回返回值。如果您想以这种方式获取值,请在查询中选择值:

SET @id=SCOPE_IDENTITY()
SELECT @id

或者简单地说:

SELECT SCOPE_IDENTITY()

当然,如果您的查询已经返回结果集,那就不会有任何好处。

如果您真的想要返回值,则需要使用ParameterDirection.ReturnValue而不是ParameterDirection.Output,然后将其作为参数值读取:

parm.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(parm);
int id = (int)cmd.Parameters["@id"].Value;