我有一个带参数@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
请指出导致这种奇怪行为的原因是什么?
答案 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;