ASP.NET Core 3.1调用SQL Server 2019带输出参数存储过程报错求助
错误原因梳理
- 首次调用时,
ExecuteSqlRawAsync返回值为SQL执行的受影响行数,并非存储过程的RETURN值或输出参数值,所以无论用户是否存在,都会返回执行操作对应的行数,导致结果始终为真。 - 调整后的代码存在三个问题:
- EXEC语句未给输出参数添加
OUTPUT关键字,SQL Server不会将计算结果回写到参数中,导致参数值为DBNull - 输出参数名称与存储过程定义的
@EXIT不匹配,参数映射错误 - 未处理
DBNull的情况就直接强转为int,触发类型转换异常
- EXEC语句未给输出参数添加
- 存储过程无需额外导入EF Core模型,直接通过原生SQL调用即可。
修正后代码
首先确保已引入正确的SQL Client命名空间:
using Microsoft.Data.SqlClient; using System.Data;
调整后的调用逻辑:
private readonly dbContext _context; public UsuariosRepository(dbContext context) { _context = context; } public async Task<bool> Login(string user, string password) { try { // 定义输入参数,和存储过程参数名对应 var loginParam = new SqlParameter("@LOGIN", user); var pwdParam = new SqlParameter("@PASSWORD", password); // 定义输出参数 var exitParam = new SqlParameter("@EXIT", SqlDbType.Int) { Direction = ParameterDirection.Output }; // 执行存储过程,注意输出参数后加OUTPUT关键字 await _context.Database.ExecuteSqlRawAsync("EXEC [dbo].[LOGIN] @LOGIN, @PASSWORD, @EXIT OUTPUT", loginParam, pwdParam, exitParam); // 处理DBNull情况,避免转换报错 int exists = exitParam.Value == DBNull.Value ? 0 : (int)exitParam.Value; return exists > 0; } catch (Exception ex) { throw ex; } }
内容的提问来源于stack exchange,提问作者Allan
相关产品推荐
相关产品推荐

