我试图从数据库上下文对象(使用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相关问答推荐

页面刷新后如何存储JS Select 数据

Razor 页面客户端站点验证不起作用

如何在 ASP.NET 全球化中配置不变文化?

从数据库中检索数据的最快方法

在每页级别增加 ASP.Net 超时

SqlBulkCopy 超时

有没有一种简单的方法可以将对象属性转换为字典

如何判断 IIS 是处于 32 位还是 64 位模式

用户NT AUTHORITY\NETWORK SERVICE登录失败

iOS 8 / Safari 8 不适用于 ASP.NET AJAX 扩展

多行文本框多个换行符

为什么 Asp.Net Identity IdentityDbContext 是一个黑盒?

实体框架:如何解决外键约束可能导致循环或多个级联路径?

如何在 ASP.NET Core Web API 中配置 JSON 格式的缩进

ServiceStack 示例应该以什么顺序被理解?

什么时候应该使用 Response.Redirect(url, true)?

ASP.Net 错误:应用程序池的标识无效

如何将列表转换为数据表

如何使用 ConfigurationManager.AppSettings

Windows 身份验证在本地 IIS 7.5 上不起作用.错误 401.1