3

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

请不要留下任何关于实体框架的函数映射的代码。

我已经尝试过了,但我一直收到同样该死的错误:

过程或函数“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,'')
4

5 回答 5

3

这可能会有所帮助:

http://blogs.msdn.com/b/diego/archive/2012/01/10/how-to-execute-stored-procedures-sqlquery-in-the-dbcontext-api.aspx

于 2012-08-02T14:25:08.370 回答
2

您没有在 Execute 中传递 TotalRecords Sql 参数

var List = db.ExecuteStoreQuery<ENT_SearchBusinessResult>(
"exec usp_BusinessUser_Search",Business,
Location,PageNumber,RecordsPerPage,parm);
于 2012-08-02T14:10:05.390 回答
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(后跟空格)之后添加片段,并向s(如果没有,则SqlParameter创建s)添加 ReturnVal 参数,尽管调用者永远不会看到这些。SqlParamter

于 2013-10-18T06:45:47.317 回答
0

参数名称不应包含@

SqlParameter parm = new SqlParameter()
{
    ParameterName = "TotalRecords",
    Value = 0,
    SqlDbType = SqlDbType.Int,
    Direction = System.Data.ParameterDirection.Output
};
于 2012-08-02T14:10:20.803 回答
0

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

于 2015-05-12T23:48:08.917 回答