所选存储过程无返回列,EF调用无法获取数据集求助
存储过程调用报错:未返回列/无法获取多数据集 解决方法
报错提示:所选存储过程或函数未返回任何列,无法在实体中获取多个数据集
调用存储过程SP_GetPendingRequset_Example的代码如下:
public virtual int SP_GetPendingRequset_Example(Nullable<int> pageNbr, Nullable<int> pageRow, Nullable<int> user_Id, string empCode) { var pageNbrParameter = pageNbr.HasValue ? new ObjectParameter("PageNbr", pageNbr) : new ObjectParameter("PageNbr", typeof(int)); var pageRowParameter = pageRow.HasValue ? new ObjectParameter("pageRow", pageRow) : new ObjectParameter("pageRow", typeof(int)); var user_IdParameter = user_Id.HasValue ? new ObjectParameter("User_Id", user_Id) : new ObjectParameter("User_Id", typeof(int)); var empCodeParameter = empCode != null ? new ObjectParameter("EmpCode", empCode) : new ObjectParameter("EmpCode", typeof(string)); return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("SP_GetPendingRequset_Example", pageNbrParameter, pageRowParameter, user_IdParameter, empCodeParameter); }
解决步骤:
确认存储过程返回逻辑
检查存储过程是否包含SELECT语句输出结果集。如果存储过程仅返回整数(如影响行数或业务返回值)而非结果集,ExecuteFunction会因无法映射结果报错,这种场景应改用ExecuteStoreCommand或处理返回参数。调整EF调用方式
当前代码用ExecuteFunction返回int,但ExecuteFunction默认用于获取结果集。如果存储过程通过RETURN返回整数,需添加返回值参数:public virtual int SP_GetPendingRequset_Example(Nullable<int> pageNbr, Nullable<int> pageRow, Nullable<int> user_Id, string empCode) { // 保留原有参数定义 var pageNbrParameter = pageNbr.HasValue ? new ObjectParameter("PageNbr", pageNbr) : new ObjectParameter("PageNbr", typeof(int)); var pageRowParameter = pageRow.HasValue ? new ObjectParameter("pageRow", pageRow) : new ObjectParameter("pageRow", typeof(int)); var user_IdParameter = user_Id.HasValue ? new ObjectParameter("User_Id", user_Id) : new ObjectParameter("User_Id", typeof(int)); var empCodeParameter = empCode != null ? new ObjectParameter("EmpCode", empCode) : new ObjectParameter("EmpCode", typeof(string)); // 添加返回值参数 var returnParam = new ObjectParameter("ReturnValue", typeof(int)); ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction( "SP_GetPendingRequset_Example", returnParam, pageNbrParameter, pageRowParameter, user_IdParameter, empCodeParameter ); return (int)returnParam.Value; }若存储过程用输出参数返回整数,需给对应参数设置
Direction = ParameterDirection.Output。保证结果集结构一致
如果存储过程存在分支逻辑,需确保所有分支返回的结果集列结构完全一致。即使某分支无数据,也要用SELECT TOP 0 [列名1], [列名2], ...保留列定义,避免EF无法识别结果结构。更新EF模型映射
若存储过程的返回列有变更,需重新更新EDMX模型中的存储过程映射,确保实体模型与存储过程返回列完全匹配。
内容的提问来源于stack exchange,提问作者KHUSHBU GUPTA
相关产品推荐
相关产品推荐

