ASP.NET Core MVC中获取SQL Server存储过程输出变量值的方法
问题分析与解决方案
首先,ExecuteSqlRaw返回-1是正常行为——它的返回值代表SQL语句执行后受影响的行数,而非存储过程的输出参数或结果集。如果你的存储过程没有执行数据修改操作(比如INSERT/UPDATE/DELETE),就会返回-1。
要获取@Status和@Code这两个输出值,有两种可靠的方式:
方式一:使用参数化输出参数(推荐,避免SQL注入)
直接通过SqlParameter定义输出参数,无需拼接复杂SQL,同时规避字符串拼接带来的SQL注入风险:
// 定义输出参数 var statusParam = new SqlParameter("@Status", SqlDbType.NVarChar, 50) { Direction = ParameterDirection.Output }; var codeParam = new SqlParameter("@Code", SqlDbType.NVarChar, 50) { Direction = ParameterDirection.Output }; var unitIdParam = new SqlParameter("@UnitId", SqlDbType.NVarChar, 50) { Direction = ParameterDirection.Output }; // 执行存储过程 context.Database.ExecuteSqlRaw( "EXEC [dbo].[sp_CheckDelinquentStatus] @villageCode, @block, @lot, @Status OUTPUT, @Code OUTPUT, @UnitId OUTPUT", new SqlParameter("@villageCode", village.Name), new SqlParameter("@block", LopezProperties.BlockNumber), new SqlParameter("@lot", LopezProperties.LotNumber), statusParam, codeParam, unitIdParam ); // 读取输出参数的值 var status = statusParam.Value?.ToString(); var code = codeParam.Value?.ToString(); var unitId = unitIdParam.Value?.ToString();
方式二:通过结果集读取(适合保留现有SQL结构的场景)
如果坚持使用当前的SQL语句,改用FromSqlRaw来读取存储过程返回的结果集(ExecuteSqlRaw不返回结果集):
- 先定义一个用于接收结果的实体类:
public class DelinquentResult { public string Status { get; set; } public string Code { get; set; } public string UnitId { get; set; } }
- 执行SQL并读取结果:
var result = context.Set<DelinquentResult>() .FromSqlRaw(delinquentSql) .FirstOrDefault(); if (result != null) { var status = result.Status; var code = result.Code; var unitId = result.UnitId; }
注意:这种方式仍存在SQL注入风险,建议优先使用方式一的参数化查询。
内容的提问来源于stack exchange,提问作者Nyssa
相关产品推荐
相关产品推荐

