【发布时间】:2015-11-15 10:12:35
【问题描述】:
我正在尝试使用从数据库上下文对象(使用实体框架 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?
【问题讨论】:
-
在您的 edmx 中,转到 Function Imports --> SearchProducts,然后双击它。返回类型设置为什么?
-
未设置返回类型。它是(无)。
-
听起来需要设置为复杂。我可能建议的唯一一件事是,因为我在执行此操作时没有让 EF 给我问题,所以更改您的 * 以在 SP 中显式选择您想要的列。也许 EF 会查看它来确定您的返回类型。然后更新您的 EDMX,以便更改反映在 EF 中。
-
注意,EF 可能很挑剔。从 EDMX 中删除存储过程并重新添加它可能是最简单的方法。我也遇到了更新问题,没有更新所有内容。以防万一您遇到其他问题。
-
我正在尝试,似乎 EF 能够通过获取表结构并推断列名来创建复杂类型。
标签: c# asp.net sql-server entity-framework stored-procedures