Выходной параметр в хранимой процедуре в EF
у меня есть существующая база данных с большим количеством сложных хранимых процедур, и я хочу использовать эту процедуру через EF 4. Я сделал следующее:
- создал объект данных EF,
Customer
. - добавлена хранимая процедура в EF
- щелкните правой кнопкой мыши на конструкторе EF и добавьте импорт функции.
- Имя Импорта Функции -
MyFunction
, сложного типа.
результирующий код:
CustomerEntities entity = new CustomerEntities();
var result = entity.MyFunction("XYZ", ref o_MyString);
Теперь моя хранимая процедура имеет выходной параметр, который я использовал для вызова ref (в WebForm). Но я получаю следующую ошибку:
не удается преобразовать из 'ref string' в - Система.Данные.Объекты.ObjectParameter'
пожалуйста, помогите
редактировать
когда я пытаюсь сохранить я получаю ниже ошибка
привязка функции сопоставления задает модель функции.Магазин.P_GetCustomer с неподдерживаемым параметром: o_MyString. Выходные параметры могут быть сопоставлены только через свойство RowsAffectedParameter. Используйте привязки результатов для возврата значений из вызова функции.
2 ответов
выходные параметры возвращаются в ObjectParameter
экземпляра. Поэтому вы должны использовать код типа:
var oMyString = new ObjectParameter("o_MyString", typeof(string));
var result = ctx.MyFunction("XYZ", oMyString).ToList();
var data = oMyString.Value.ToString();
причина в том, что импорт функции не может использовать параметр ref, потому что выходной параметр не заполняется, пока вы не обработаете результирующий набор из базы данных = если вы не вызываете ToList
или повторите результат хранимой процедуры выходной параметр равен null.
в MSDN напрашивается следующий:
CREATE PROCEDURE dbo.GetDepartmentName @ID INT , @Name NVARCHAR(50) OUTPUT AS SELECT @Name = Name FROM Department WHERE DepartmentID = @ID
решение
using (SchoolEntities context = new SchoolEntities()) { // name is an output parameter. ObjectParameter name = new ObjectParameter("Name", typeof(String)); context.GetDepartmentName(1, name); Console.WriteLine(name.Value); }