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

时间:2011-03-06 17:47:12

标签: 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

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()时。

有什么想法吗?

3 个答案:

答案 0 :(得分:12)

...
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

这也适用于多行。

答案 1 :(得分:5)

您需要添加方向为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;

答案 2 :(得分:0)

SqlParameter retval = cmd.Parameters.Add("@returnValue", SqlDbType.Int); 
            retval.Direction = ParameterDirection.ReturnValue;