You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

所选存储过程无返回列,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 13:22:48