不修改存储过程前提下调用其返回Integer值报错如何解决
问题根因
ExecuteSqlRaw方法的返回值是SQL执行后的受影响行数,无法读取存储过程末尾SELECT 1返回的结果集。如果你之前尝试过用FromSql方法读取结果,因为存储过程返回的单列没有指定别名,和你用来接收结果的BuildIDDetailResultDto属性名无法匹配,就会触发你遇到的报错:
Required column was not present in 'FromSql' operation
- 你不需要修改现有存储过程,只要调整调用方式即可拿到返回的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
相关产品推荐
相关产品推荐

