我试图获取内容一个表,其中包含从数据库上下文对象调用的动态SQL存储过程(使用Entity Framework 6.1.1),以便填充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
Run Code Online (Sandbox Code Playgroud)
然后我用来执行存储过程的C#代码是:
var db = new MyEntities();
var TEST_SEARCH_TERM = "product";
var result = db.SearchProducts(TEST_SEARCH_TERM);
MyGridView.DataSource = result;
MyGridView.DataBind();
Run Code Online (Sandbox Code Playgroud)
执行时,在Visual Studio的数据库资源管理器中,存储过程正常工作.但是当在运行的ASP.NET应用程序中执行时,我在DataBind()
方法中得到一个异常,因为result
返回-1
而不是IEnumerable
DataSet
包含由存储过程的SELECT产生的对象.
如何检索数据并填充我的数据GridView
?
我有一个存储过程,该存储过程根据数据库中是否存在指定的电子邮件地址返回一个0
或一个1
:
CREATE PROCEDURE [DatabaseSchema].[EmailAddressIsDuplicate] (@emailAddress nvarchar(255))
AS
BEGIN
SET NOCOUNT ON;
IF EXISTS(
SELECT *
FROM [DatabaseSchema].[EmailUpdatesRegistrant]
WHERE EmailAddress = @emailAddress
)
RETURN 1
ELSE
RETURN 0
RETURN 0
END
GO
Run Code Online (Sandbox Code Playgroud)
我正在尝试从Entity Framework 6数据库上下文派生此存储过程的结果:
using (DatabaseContext dbContext = new DatabaseContext())
{
ObjectParameter param = new ObjectParameter("emailAddress", typeof(bool));
var result = dbContext.EmailAddressIsDuplicate(emailAddress);
}
Run Code Online (Sandbox Code Playgroud)
我遇到很多错误。
错误1:使用上述代码,var result
始终设置为-1。
错误2:我尝试导航到Edit Function Import
并将其设置Returns a Collection Of
为Boolean
标量值。这将引发以下错误:
商店数据提供者返回的数据读取器没有足够的列用于请求的查询。
错误#3:我返回并将Edit Function …
c# sql-server stored-procedures entity-framework entity-framework-6