2012-08-02 97 views
3

是否有可能使用Entity Framework执行存储过程,传递变量并返回数据以及返回值?实体框架:如何运行存储过程并返回值?

请不要留下任何有关与实体框架功能映射的代码。

我已经尝试这样做,我不断收到同样的错误该死:

Procedure or function 'usp_BusinessUser_Search' expects parameter '@TotalRecords', which was not supplied.

这里是我的代码:

SqlParameter Business = new SqlParameter("Business", Search.Term); 
SqlParameter Location = new SqlParameter("Location", Search.Location); 
SqlParameter PageNumber = new SqlParameter("PageNumber", Search.CurrentPage); 
SqlParameter RecordsPerPage = new SqlParameter("RecordsPerPage", Search.RecordsPerPage); 
SqlParameter TotalRecords = new SqlParameter("TotalRecords", 0); 

SqlParameter parm = new SqlParameter() 
{ 
    ParameterName = "@TotalRecords", 
    Value = 0, 
    SqlDbType = SqlDbType.Int, 
    Direction = System.Data.ParameterDirection.Output 
}; 

var List = db.ExecuteStoreQuery<ENT_SearchBusinessResult>("exec usp_BusinessUser_Search",Business,Location,PageNumber,RecordsPerPage,parm); 

没有人有任何的想法是什么原因造成的?

感谢

编辑:

存储过程的代码:

ALTER PROCEDURE [dbo].[usp_BusinessUser_Search] ( @Business nVarChar(255) = NULL 
                , @Location nVarChar(255) = NULL 
                , @PageNumber Int = 1 
                , @RecordsPerPage Int = 10 
                , @TotalRecords Int OUTPUT) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @SQL NVARCHAR(MAX) 
      , @CacheTable SYSNAME 
      , @TotalRows Int 
      , @Category VarChar(255) 
      , @BusinessCategory Int 
      , @TownCounty VarChar(50) 
      , @PcodeTownCounty VarChar(50) 

    INSERT Voucher_SearchHistory (Keyword, Location) 
    SELECT NULLIF(@Business,''), NULLIF(@Location,'') 
+0

你的存储过程声明是什么样的? – 2012-08-02 14:18:58

+0

请参阅编辑 – Funky 2012-08-02 14:24:15

回答

2

你是不是传递总记录SQL参数在Excecute

var List = db.ExecuteStoreQuery<ENT_SearchBusinessResult>(
"exec usp_BusinessUser_Search",Business, 
Location,PageNumber,RecordsPerPage,parm); 
+0

parm与Total记录相同,我只是想我会尝试一种不同的方法,使用变量Totalrecords返回: 参数化查询'(@Business nvarchar(14),@ Location nvarchar(14) ,@ PageNumber int,@'需要参数'@TotalRecords',它没有提供。 – Funky 2012-08-02 14:14:51

+0

@Funky我的意思是没有必要给@我应该已经更清楚的话,道歉队友 – HatSoft 2012-08-02 14:16:19

+0

是的,就像我说的,我已经尝试过@和没有 – Funky 2012-08-02 14:18:04

0

参数名称不应包含@

SqlParameter parm = new SqlParameter() 
{ 
    ParameterName = "TotalRecords", 
    Value = 0, 
    SqlDbType = SqlDbType.Int, 
    Direction = System.Data.ParameterDirection.Output 
}; 
+0

试图用@和没有,没有喜悦 – Funky 2012-08-02 14:11:33

+0

按照MSDN我不认为这是必要给@看到这里的例子http://msdn.microsoft.com/en-us/library/bb896334 .aspx – HatSoft 2012-08-02 14:12:24

1

您现在可以使用下面的扩展方法,ExecuteSqlCommandWithReturn,是负责所有的工作的为您服务!

https://gist.github.com/copernicus365/7037320

string sql = "EXEC sp_CoolProc @SomeParam, @AnotherParam"; 
int returnValue; 
int val = db.ExecuteSqlCommandWithReturn(sql, out returnValue, someParam, anotherParam); 

的关键解决方案是由揭阳胡here,这也是本(但要注意以下所有的完全由上述扩展方法处理):正如你可以做一个SQL提示,只需设置执行过程到SQL变量(在这种情况下被发送作为一个参数)的结果,如下所示:

EXEC @ReturnVal = sp_MyCoolProc; 

此代码的第一012之后添加的片段(后跟空格),它找到并添加到SqlParameter s(或创建SqlParamter s,如果没有)ReturnVal参数,但调用者将永远不会看到这些参数。

+0

我试着从'SELECT COUNT(*)...'查询中得到计数,但它不起作用。我总是得到一个很大的负数作为returnValue。任何想法? – newman 2014-08-24 04:00:31

0

如果您刚刚添加了该参数('@TotalRecords)最近 我会猜测您只需要在您的edmx模型中更新您的函数导入定义。