.NET Core — ExecuteSqlRaw — последний вставленный идентификатор?

#sql #asp.net-core

#sql #asp.net-core

Вопрос:

Это кажется глупым, но я не могу найти ни одного примера кода, который показывает, как получить последний вставленный id при выполнении запроса insert с ExecuteSqlRaw

 var sql = @"INSERT INTO [MyDb-Dev].[dbo].["   table   "] (...) VALUES (...)";
_context.Database.ExecuteSqlRaw(sql);
 

Как мне получить последний вставленный id файл?

Спасибо за вашу помощь

Комментарии:

1. Уверен, что вы можете сделать это с помощью выходного параметра. Взгляните на эту ссылку: yogihosting.com/stored-procedures-entity-framework-core

2. но как вы можете сохранить идентификатор вставленной записи в выходном параметре?

Ответ №1:

Вы можете получить вставленный идентификатор с OUTPUT помощью MS SQL Server.

ВЫВОД возвращает информацию или выражения на основе каждой строки, на которую влияет оператор INSERT, UPDATE, DELETE или MERGE. Эти результаты могут быть возвращены в приложение обработки для использования в таких вещах, как сообщения с подтверждением, архивирование и другие подобные требования к приложению.

 var sql = @"INSERT INTO [MyDb-Dev].[dbo].["   table   "] (...) OUTPUT inserted.Id VALUES (...)";
int returnValue = _context.Database.SqlQuery<int>(sql).FirstOrDefault();
 

Комментарии:

1. это не работает, я вставляю запись, вводя идентификатор, он должен быть 23 (идентификатор в БД тоже), возвращаемое значение равно 1

2. это делается для всех вставленных записей

3. Я попытался использовать ExecuteSqlCommand, та же проблема, при тестировании фиктивного запроса в SQL возвращается правильный value…is есть ошибка где-то в API?

4. @phil123456 Я обновил свой ответ, вместо ExecuteSqlCommand вы можете использовать SqlQuery и преобразовать значение в int.

Ответ №2:

добавьте это в запрос

 ;SELECT @LastCreatedId = CAST(SCOPE_IDENTITY() as int)
 

добавьте параметр к вызову

 var returnCode = new SqlParameter("@LastCreatedId", SqlDbType.Int);
returnCode.Direction = ParameterDirection.Output;
 

получите значение следующим образом

 _context.Database.ExecuteSqlCommand(sql3, parameters);
returnValue = (int)returnCode.Value;
 

Комментарии:

1. Это работает только в том случае , если в таблице есть свойство с идентификатором на нем …