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

不修改存储过程前提下调用其返回Integer值报错如何解决

问题根因

  1. ExecuteSqlRaw方法的返回值是SQL执行后的受影响行数,无法读取存储过程末尾SELECT 1返回的结果集。如果你之前尝试过用FromSql方法读取结果,因为存储过程返回的单列没有指定别名,和你用来接收结果的BuildIDDetailResultDto属性名无法匹配,就会触发你遇到的报错:

Required column was not present in 'FromSql' operation

  1. 你不需要修改现有存储过程,只要调整调用方式即可拿到返回的Integer值。

解决方案

方案1:EF Core 7.0+ 直接读取标量结果

直接使用Database.SqlQuery<T>方法读取返回的int值,修改你的调用代码如下:

public void UpdateProcessStatusByBuildId(BuildIDDetailDTO buildDetailsData)
{
    int result;
    Contract.Requires(buildDetailsData != null);
    if (buildDetailsData == null) return;
    
    try
    {       
        using (var _context = _contextFactory.CreateDbContext())
        {
            result = _context.Database.SqlQuery<int>(
                $"EXEC CIT_UpdateContentSetDetailsProcessStatusByBuildId @Id={buildDetailsData.Id}, @BuildId={buildDetailsData.BuildId}, @SourceId={buildDetailsData.SourceId}"
            ).First();
        }
        // 后续可使用result变量处理业务逻辑
    }
    catch (Exception ex)
    {
        throw;
    }
}

方案2:全版本兼容的ADO.NET原生读取方案

如果你的EF Core版本低于7.0,没有SqlQuery<T>方法,可以直接调用底层ADO.NET接口读取结果,不需要依赖实体属性匹配:

public void UpdateProcessStatusByBuildId(BuildIDDetailDTO buildDetailsData)
{
    int result;
    Contract.Requires(buildDetailsData != null);
    if (buildDetailsData == null) return;
    
    try
    {       
        using (var _context = _contextFactory.CreateDbContext())
        using (var cmd = _context.Database.GetDbConnection().CreateCommand())
        {
            cmd.CommandText = "CIT_UpdateContentSetDetailsProcessStatusByBuildId";
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            // 添加参数,处理BuildId为空的边界情况
            cmd.Parameters.Add(new SqlParameter("@Id", buildDetailsData.Id));
            cmd.Parameters.Add(new SqlParameter("@BuildId", string.IsNullOrEmpty(buildDetailsData.BuildId) ? (object)DBNull.Value : buildDetailsData.BuildId));
            cmd.Parameters.Add(new SqlParameter("@SourceId", buildDetailsData.SourceId));
            
            _context.Database.OpenConnection();
            using (var reader = cmd.ExecuteReader())
            {
                if(reader.Read())
                {
                    // 直接读取第一列的值,不需要匹配列名
                    result = reader.GetInt32(0);
                }
            }
        }
        // 后续可使用result变量处理业务逻辑
    }
    catch (Exception ex)
    {
        throw;
    }
}

内容的提问来源于stack exchange,提问作者Anusha gp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:54:03