实体框架:如何运行存储过程并返回值?

时间:2012-08-02 14:06:02

标签: c# linq entity-framework stored-procedures

是否可以使用实体框架执行存储过程,传入变量并返回数据以及返回值?

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

我试过这个并且我一直得到同样的错误:

  

过程或函数'usp_BusinessUser_Search'需要参数   '@TotalRecords',未提供。

这是我的代码:

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,'')

5 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

您没有在执行中传递Total Records Sql参数

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

答案 2 :(得分: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);

解决方案的关键是由Jieyang Hu here,这是(虽然注意以下所有内容都完全由前面提到的扩展方法处理):正如你在SQL提示符中所做的那样,你只需将执行过程的结果设置为SQL变量(在这种情况下,作为参数发送),如下所示:

EXEC @ReturnVal = sp_MyCoolProc;

此代码在找到的第一个@ReturnVal =(后跟空格)之后添加片段EXEC,并添加到SqlParameter s(或创建SqlParamter s没有)一个ReturnVal参数,虽然调用者永远不会看到这些。

答案 3 :(得分:0)

参数名称不应包含@

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

答案 4 :(得分:0)

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