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;