Получить значение SQL INSERT OUTPUT в c # - PullRequest
1 голос
/ 02 декабря 2010

В хранимом SQL-процессе я вставляю строку и надеюсь вернуть IDENTITY INT для новой строки, а затем получить ее в своем коде C #.

ALTER PROCEDURE the_proc @val_2 VARCHAR(10), @val_3 VARCHAR(10)
AS
BEGIN
SET NOCOUNT ON
INSERT INTO the_table (field_2, field_3)
  OUTPUT INSERTED.field_1
  VALUES (@val_2, @val_3)
END

В C # я использую LINQно я нечетко о том, как получить это значение OUTPUT.Я попытался включить его в качестве параметра OUTPUT в декларации SQL-процедуры, но также не смог заставить это работать (исключение жаловалось на то, что оно не указано в вызове)Самое близкое, что я получил, - это прогулка по коду Db.designer.cs, где IExecuteResult result ReturnValue содержит 0 (не правильно), но проверка содержащегося в нем представления результатов (result.ReturnValue Results View) ОБЯЗАТЕЛЬНО имеет искомое значение.

key = (int)(db.TheProc(val2,val3).ReturnValue);

key возвращается как 0. Мне нужно значение IDENTITY INT из INSERT.

Ответы [ 3 ]

1 голос
/ 02 декабря 2010
OUTPUT INSERTED.* 

- это то же самое, что и выбор. Так что это не будет отображаться как выходной параметр, а вернется как набор результатов.

Кстати, ReturnValue на самом деле должно быть равно нулю, что вы и видите в этом случае.

Вам нужно изменить оператор linq, чтобы он захватывал этот набор результатов.

1 голос
/ 02 декабря 2010

Крис Лайвли подтолкнул меня в правильном направлении, то есть пересмотр кода C # Linq.Следующее извлекает Field_1 из результатов.Может быть, это странный способ попасть туда, а не обычная идиома, поэтому, если у кого-то есть предложения по поводу чего-то более «правильного», добавьте комментарий или ответ.

var o = from res in db.MyProc( Val1, Val2 )
           select res.Field_1;
int key = o.ToArray()[0];

Спасибо.

1 голос
/ 02 декабря 2010

Попробуйте вместо этого (при условии, что SQL Server):

ALTER PROCEDURE the_proc 
@val_2 VARCHAR(10), 
@val_3 VARCHAR(10), 
@newKey int OUTPUT
AS
BEGIN
  SET NOCOUNT ON
  INSERT INTO the_table (field_2, field_3) VALUES (@val_2, @val_3)
  SET @newKey = SCOPE_IDENTITY()
END

После того, как вы определили свою хранимую процедуру the_proc для своего dbml LINQ to SQL, вы можете сделать это:

        int? newKey = null;
        dataContext.the_proc("val1", "val2", ref newKey);
        // newKey.Value now contains your new IDENTITY value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...