2

Я хранимую процедуру, которая вставляет в таблицу затем выполняет эту линиюEntity Framework и SCOPE_IDENTITY

SET @returnVal = SCOPE_IDENTITY(); 

и после этого я попытался как:

SELECT @returnVal 

и

return @returnVal 

Когда я выполняю хранимую процедуру из Microsoft SQL Server Management Studio, я получаю ожидаемый результат с помощью SELECT @returnVal - выбран столбец идентификатора для вставленных данных.

Однако, когда я добавляю хранимую процедуру в класс ADO.Net Entity Data Model/EntityFramework/.edmx и выполняю хранимую процедуру в своем коде на C#, я получаю возвращаемое значение -1.

Возможно ли получить значение, которое я хочу, новое значение идентификации, вернулось?

Я понимаю, что я могу вручную привязать хранимую процедуру к действию вставки таблицы в моей модели, но это не вариант. Слишком много процедур вставки для выполнения этой ручной работы каждый раз, когда я восстанавливаю класс (ы) модели.

+0

Возможный дубликат [Получение SCOPE \ _IDENTITY из SQL Server on Insert] (http://stackoverflow.com/questions/4918574/getting-scope-identity-from-sql-server-on-insert) – Grax

+2

Вы используете ExecuteNonQuery, когда вы должны использовать ExecuteScalar? – Grax

+0

и исполнительный код?NonQuery по любой причине –

ответ

2

Объявите тип выходного параметра в определении процедуры:

create procedure [dbo].[Procedurename] @returnVal int output 
as 
SET @returnVal = SCOPE_IDENTITY(); 

и при вызове хранимой процедуры называют его:

declare @returnVal int 
exec Procedurename @returnVal output 
print @returnVal 
+0

Это сработало. Мой новый код добавлен в сообщение. – Dudeman3000

+0

Пожалуйста, отметьте ответ как ответ, если он сработает :) – Sonam

+0

Выполнено, спасибо Sonam! – Dudeman3000

0

context.Database.ExecuteSqlCommand возвращения команды результата выполнения, а не результат запроса , Если вам нужно получить данные, кроме использования context.Database.SqlQuery.

SET @ReturnVal=SCOPE_IDENTITY(), а затем использовать выбор.

Пример: How to use DbContext.Database.SqlQuery<TElement>(sql, params) with stored procedure? EF Code First CTP5

+1

Это, скорее всего, хорошее решение, однако я отметил другое решение, так как ответ bc решил мою проблему, и мне не пришлось менять способ, которым я вызывал хранимую процедуру (w EF DbContext) - все, что мне нужно было сделать был добавлен параметр out в хранимую процедуру и код C#. – Dudeman3000

0

взяты из ФОС вопрос

Добавление выходного параметра работал (ответ отмечен ниже).

Хранимая процедура подписи будет выглядеть так:

Моя хранимая процедура подписи теперь выглядит следующим образом:

CREATE PROCEDURE SP_MyStoreProc ([Multiple Parameters], @returnVal int output) 

Последняя строка хранимой процедуры:

return @returnVal 

Мои Код C# выглядит следующим образом: (db является экземпляром моего класса dbContext)

System.Data.Objects.ObjectParameter identityParameter = 
new System.Data.Objects.ObjectParameter("returnVal", 0); 

db.SP_MyStoredProc([Multiple Parameters], identityParameter); 

int myNewIdentity = Convert.ToInt32(identityParameter.Value);