T-SQL:将新的INSERT标识返回给C#

我正在使用存储过程将值放入SQL Server。 过程将向添加的行添加ID。 我需要将此ID返回到我的代码中。

目前我可以在Visual Studio的OUTPUT窗口中看到输出ID,但似乎无法在我的代码中捕获它。 以下是proc的摘要版本:

SQL

CREATE PROCEDURE dbo.DoSomething ( @var1 INT = NULL, @var2 INT = NULL, @var3 DATE = NULL ) AS BEGIN INSERT INTO atable ( vara, varb, varc ) VALUES ( @var1, @var2, @var3 ) RETURN SCOPE_IDENTITY() END 

C#:

 int result = 0; /// create command SqlCommand cmd = new SqlCommand("DoSomething", this.OpenSqlConnection()); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@var1", thing.value1); cmd.Parameters.AddWithValue("@var2", thing.value2); cmd.Parameters.AddWithValue("@var3", thing.value3); /// send data to db result = (int)cmd.ExecuteScalar(); 

所以我收到一个错误: 对象引用未设置为对象的实例。 当它到达(int)cmd.ExecuteScalar()时。

有任何想法吗?

 ... SELECT SCOPE_IDENTITY() 

RETURN值实际上作为特殊的OUTPUT参数返回。 SELECT为ExecuteScalar提供结果集。

您也可以使用OUTPUT子句而不是单独的SELECT:

 ... AS BEGIN INSERT INTO atable ( vara, varb, varc ) OUTPUT INSERTED.IDCol VALUES ( @var1, @var2, @var3 ) END GO 

这也适用于多行。

您需要添加另一个方向为ReturnValue参数:

 var param = cmd.Parameters.Create("@ReturnValue"); param.Direction = ParameterDirection.ReturnValue; cmd.Parameters.Add(param); 

执行后该参数的值将为返回值:

 var newId = cmd.Parameters["@ReturnValue"].Value; Or var newId = param.Value; 
 SqlParameter retval = cmd.Parameters.Add("@returnValue", SqlDbType.Int); retval.Direction = ParameterDirection.ReturnValue;