c# - 使用 Entity Framework 从存储过程中获取数据

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

我正在尝试使用从数据库上下文对象(使用 Entity Framework 6.1.1)调用的动态 SQL 存储过程获取表的内容,以便填充 GridView 控件。我无法检索数据。

这是存储过程。这是一个关于存储过程中 SQL 注入(inject)的学生演示,所以我知道这是可注入(inject)的,没问题。

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

最佳答案

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

  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 的替代品。

关于c# - 使用 Entity Framework 从存储过程中获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32140774/

相关文章:

sql-server - 对多列进行透视 (T-SQL)

c# - 寻找最长的子串正则表达式?

c# - .NET 继承 (WinForms) 表单 - VS 设计器问题

c# - EF Core - 值不能为空。 (参数 'key' )

javascript - 如何在javascript中的gridview中获取运行时创建的文本框的id

java - 如何用java显示sql server中的数据 [android studio]

c# - 在 C# 中使用 Regex 提取 Form 标记中的操作属性?

asp.net - 运行 .net 项目时如何更改默认浏览器

asp.net - 样式化 asp.net 图表控件

c# - ASP.NET Web 应用程序的 SQL 性能不佳