小编典典

使用Entity Framework从存储过程获取数据

c#

我正在尝试使用从数据库上下文对象(使用Entity Framework
6.1.1)调用的动态SQL存储过程来获取表的内容,以便填充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();

在执行时,在Visual
Studio的数据库资源管理器中,存储过程可以正常工作。但是,当在运行中的ASP.NET应用程序中执行该DataBind()方法时,我在该方法中遇到了一个异常,因为result返回-1而不是IEnumerable
DataSet包含存储过程的SELECT生成的对象。

如何获取数据并填充我的数据GridView


阅读 470

收藏
2020-05-19

共1个答案

小编典典

使用以下步骤解决此问题:

  1. 您需要将存储过程导入为函数。右键单击实体模型的工作区,然后选择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
Framework的版本。另外,Entity Framework不具有丰富的存储过程支持,因为它是ORM而不是SQL的替代品。

2020-05-19