Вопрос:

Получение данных из хранимой процедуры с Entity Framework

c# asp.net sql-server entity-framework stored-procedures

33924 просмотра

4 ответа

854 Репутация автора

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

Вот хранимая процедура. Это для студенческой демонстрации внедрения SQL в хранимых процедурах, поэтому я ЗНАЮ, что это инъекция, и это нормально.

ALTER PROCEDURE dbo.SearchProducts
  @SearchTerm VARCHAR(max)
AS
BEGIN
  DECLARE @query VARCHAR(max)
  SET @query = 'SELECT * FROM dbo.Products WHERE Name LIKE ''%' + @SearchTerm + '%'''
  EXEC(@query)
END

Код C #, который я затем использую для выполнения хранимой процедуры:

var db = new MyEntities();
var TEST_SEARCH_TERM = "product";
var result = db.SearchProducts(TEST_SEARCH_TERM);

MyGridView.DataSource = result;
MyGridView.DataBind();

При выполнении в Database Explorer в Visual Studio хранимая процедура работает нормально. Но при выполнении в запущенном приложении ASP.NET я получаю исключение в DataBind()методе, потому что он resultвозвращает -1вместо IEnumerable DataSetсодержимого объекты, являющиеся результатом SELECT хранимой процедуры.

Как я могу получить данные и заполнить мой GridView?

Автор: mak Источник Размещён: 21.08.2015 12:50

Ответы (4)


0 плюса

389 Репутация автора

Убедитесь, что ваш EDMX имеет тип возвращаемого значения: Перейдите в Импорт функций -> SearchProducts и дважды щелкните по нему.

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

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

РЕДАКТИРОВАТЬ

Может быть, вы можете изменить свой SP, как показано ниже:

ALTER PROCEDURE dbo.SearchProducts
  @SearchTerm VARCHAR(max)
AS
BEGIN
  SELECT * FROM dbo.Products WHERE Name LIKE '%' + @SearchTerm + '%'
END
Автор: Vahlkron Размещён: 21.08.2015 02:36

30 плюса

32157 Репутация автора

Решение

Используйте следующие шаги для решения этой проблемы:

  1. Вам необходимо импортировать хранимую процедуру как функцию. Щелкните правой кнопкой мыши на рабочей области вашей модели Entity и выберите Add -> Function Import.
  2. В диалоговом окне «Добавление функции импорта» введите имя, к которому должна быть привязана ваша хранимая процедура в вашей модели, например Search_Products, выберите вашу процедуру в раскрывающемся списке, выберите возвращаемое значение процедуры Entitiesи выберите Productsв раскрывающемся списке. список.
  3. Тогда в коде позади:

    var db = new MyEntities();
    var TEST_SEARCH_TERM = "product";
    var result = db.Search_Products(TEST_SEARCH_TERM);//Search_Products is the name that you specified in Function Import dialog
    
    MyGridView.DataSource = result;
    MyGridView.DataBind();
    

Причина, по которой вы получаете -1результат, заключается в том, что Entity Framework не может поддерживать значения возвращаемых хранимых процедур «из коробки». Я думаю, что поддержка возвращаемых значений хранимой процедуры зависит от версии платформы Entity. Также Entity Framework не имеет расширенной поддержки хранимых процедур, потому что это ORM, а не замена SQL.

Автор: Salah Akbari Размещён: 02.09.2015 05:04

3 плюса

224 Репутация автора

Я сталкивался с этим раньше с помощью хранимых процедур, использующих динамический SQL. Я успешно использовал сложные типы, если я добавил строку «SET FMTONLY OFF;» (см. https://msdn.microsoft.com/en-us/library/ms173839.aspx ) в верхней части моей хранимой процедуры, прежде чем она будет добавлена ​​в модель EF. После того, как вы настроили модель с вашим сложным типом, обязательно удалите эту строку.

Пример:

ALTER PROCEDURE dbo.SearchProducts
  @SearchTerm VARCHAR(max)
AS
BEGIN
  SET FMTONLY OFF;
  DECLARE @query VARCHAR(max)
  SET @query = 'SELECT * FROM dbo.Products WHERE Name LIKE ''%' + @SearchTerm + '%'''
  EXEC(@query)
END
Автор: gotmilk13531 Размещён: 03.09.2015 08:32

0 плюса

0 Репутация автора

Кажется, вы решили свою проблему, официальная документация от Microsoft доступна по ссылкам ниже:

Как импортировать хранимую процедуру в модель данных вашей сущности: https://msdn.microsoft.com/en-us/library/vstudio/bb896231(v=vs.100).aspx

Сложные типы в конструкторе EF: https://msdn.microsoft.com/en-gb/data/jj680147.aspx

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

Автор: user1641172 Размещён: 08.09.2015 01:43
Вопросы из категории :
32x32