我正在尝试使用从数据库上下文对象(使用 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
?
最佳答案
使用以下步骤解决此问题:
- 您需要将存储过程作为函数导入。右键单击实体模型的工作区并选择
Add -> Function Import
。 - 在“添加函数导入”对话框中,输入您希望在模型中引用存储过程的名称,例如
Search_Products
,从下拉列表中选择您的过程,然后选择返回值程序的名称是Entities
并从下拉列表中选择Products
。 然后在后面的代码中:
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/