我试图从数据库上下文对象(使用Entity Framework 6.1.1)调用一个动态SQL存储过程,通过一个表来获取内容,以便填充一个GridView控件.我无法检索数据.

下面是存储过程.这是一个关于存储过程中SQL注入的学生演示,所以I KNOW这是可注入的,很好.

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();

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

如何检索数据并填充我的GridView

推荐答案

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

  1. 您需要将存储过程作为函数导入.右键单击实体模型的工作区,然后 Select Add -> Function Import.
  2. 在add function Import对话框中,输入希望在模型中引用存储过程的名称(例如Search_Products),从下拉列表中 Select 您的过程,并将该过程的返回值 Select 为Entities,然后从下拉列表中 Select 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();
    

Result获得-1的原因是实体框架不支持现成的存储过程返回值.我认为对存储过程返回值的支持取决于实体框架的版本.此外,实体框架不支持丰富的存储过程,因为它是ORM,而不是SQL的替代品.

Asp.net相关问答推荐

由于 Blazor Change Detection API,组件重新渲染被跳过.如何避免?

强制从 /bin 而不是 GAC 加载程序集?

IIS HTTP 错误 500.19

在 aspx 页面中使用 if else 和 eval

Anti-Forgery Token 适用于不同的基于声明的用户

如果站点在 localhost 或 127.0.0.1 上运行,如何判断 ASP.NET MVC 视图

不支持关键字:服务器

如何在 ASP.Net Core Razor 页面上重定向

ASP.NET RadioButton 与名称(组名)混淆

如何将图像 url 转换为 system.drawing.image

InvalidOperationException:无法为角色创建 DbSet,因为此类型未包含在上下文模型中

Asp.Net web 服务:我想返回错误 403 禁止

IISExpress 找不到使用 Visual Studio 2013 运行 localhost 的 ssl 页面

协调 ASP.NET 脚本包和源映射

简单的 LINQ 和列表错误:WhereListIterator`1[Task]' to type 'System.Collections.Generic.List`1[Task]'

ASP.NET Excel 导出编码问题

使用 ConfigurationManager.RefreshSection 重新加载配置而不重新启动应用程序

System.Threading.Tasks - 限制并发任务的数量

将 HTML 字符串转换为图像

为什么 Controls 集合不提供所有 IEnumerable 方法?