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

Yak*_*kov 0 c# sql sql-server stored-procedures sql-server-2012

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

SET @id=SCOPE_IDENTITY()
RETURN @id
Run Code Online (Sandbox Code Playgroud)

我从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
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*eve 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;
Run Code Online (Sandbox Code Playgroud)

或者您可以将查询本身更改为最后一行

SELECT SCOPE_IDENTITY()
Run Code Online (Sandbox Code Playgroud)

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

object result = cmd.ExecuteScalar();
if(result != null) 
    id = Convert.ToInt32(result);
Run Code Online (Sandbox Code Playgroud)