Вызов хранимой процедуры с параметрами - PullRequest
8 голосов
/ 21 февраля 2011

У меня есть хранимая процедура, которая возвращает значение, а не набор данных, и у меня возникают проблемы с его настройкой для работы с EF4.

Я видел это: http://dotnet.dzone.com/news/how-retrieve-stored-procedure

Вот что я сделал: я добавил процедуру в модель и импортировал функцию.

Первая проблема, с которой я столкнулся, заключалась в том, что параметры в моей процедуре были названы как @_Parameter_in. Это заставило EF ввести их как p_Parameter_in, потому что это не будет работать с подчеркиванием в качестве первого символа. Затем, когда я вызвал хранимую процедуру, я вижу в вызове SQL Profiler, что он ищет @p_Parameter_in, и, конечно, с этим возникла проблема.

Теперь я переименовал параметры и заглянул в SQL Trace - все выглядит и работает отлично. Проблема в том, что я не могу получить значение. Вот как выглядит мой код:

System.Data.Objects.ObjectParameter newKey = new System.Data.Objects.ObjectParameter("NewKey_out", typeof(Int32));
newKey.Value = 0;
context.GetNextSurrogateKey_v2("tTest", newKey);

После вызова newKey.Value это всегда 0 или любое другое значение, которое я установил. Это не возвращает значение. Я подозреваю, что моя проблема заключается в том, как я импортирую функцию. Я использую Скаляры и тип данных Int32. «Создать новый сложный тип» для меня почему-то отключен. У кого-нибудь была такая проблема?

Ответы [ 3 ]

7 голосов
/ 21 февраля 2011

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

Я полагаю, что вы хотите определить новую функцию в EDM и указать ее на хранимую процедуру.Быстрый Google имеет это потенциальное решение: http://www.devtoolshed.com/using-stored-procedures-entity-framework-scalar-return-values

HTH

2 голосов
/ 23 января 2012

Проблема в том, что выходные параметры EF обрабатываются после окончания чтения данных.Обычно это происходит после вызова функции DataBind ().У меня была такая же проблема с более длительными процедурами обработки.Я решаю эту проблему с помощью функции .ToList () для ObjectResult.

var rowsCount = new ObjectParameter("RowsCount", typeof(Int32));    
var result = db.GetProductList(pageSize, pageNumber, rowsCount).ToList();
this.ProductsCount = (int?)rowsCount.Value;

Отдельные строки или значения можно решить с помощью функции FirstOrDefault ().

0 голосов
/ 18 августа 2017

У меня была та же проблема, что описал Ян Ремунда.Кто-то изменил тип возвращаемого значения с Integer на Entity.Core.Objects.ObjectResult (of Integer?), В результате чего всегда ничего не возвращалось.

Для нас решение состояло в том, чтобы заставить EF прочитать возврат сохраненного процесса, добавив функцию .FirstOrDefault () к возвращению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...