T-SQL: возврат нового идентификатора INSERT в C # - PullRequest
4 голосов
/ 06 марта 2011

Я помещаю значения в SQL Server с помощью хранимой процедуры.Процедура добавит идентификатор в добавляемую строку.Мне нужно вернуть этот идентификатор обратно в мой код.

В настоящее время я могу получить выходной идентификатор в окне OUTPUT Visual Studio, но не могу зафиксировать его в своем коде.Вот краткая версия процедуры:

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 ]

12 голосов
/ 06 марта 2011
...
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

Это также будет работать для нескольких строк.

5 голосов
/ 06 марта 2011

Вам необходимо добавить еще один параметр с направлением 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;
0 голосов
/ 06 марта 2011
SqlParameter retval = cmd.Parameters.Add("@returnValue", SqlDbType.Int); 
            retval.Direction = ParameterDirection.ReturnValue;
...