Tom*_*icz 4 c# sql return-value scope-identity
我正在使用存储过程将值放入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
Run Code Online (Sandbox Code Playgroud)
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();
Run Code Online (Sandbox Code Playgroud)
所以我收到一个错误:对象引用未设置为对象的实例.当它到达(int)cmd.ExecuteScalar()时.
有任何想法吗?
gbn*_*gbn 12
...
SELECT SCOPE_IDENTITY()
Run Code Online (Sandbox Code Playgroud)
RETURN值实际上作为特殊的OUTPUT参数返回.SELECT为ExecuteScalar提供结果集.
您也可以使用OUTPUT子句而不是单独的SELECT:
...
AS
BEGIN
INSERT INTO atable
(
vara,
varb,
varc
)
OUTPUT INSERTED.IDCol
VALUES
(
@var1,
@var2,
@var3
)
END
GO
Run Code Online (Sandbox Code Playgroud)
这也适用于多行.
您需要添加另一个方向为的参数ReturnValue
:
var param = cmd.Parameters.Create("@ReturnValue");
param.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(param);
Run Code Online (Sandbox Code Playgroud)
执行后该参数的值将为返回值:
var newId = cmd.Parameters["@ReturnValue"].Value;
Or
var newId = param.Value;
Run Code Online (Sandbox Code Playgroud)