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

ASP.NET Core 3.1调用SQL Server 2019带输出参数存储过程报错求助

错误原因梳理

  1. 首次调用时,ExecuteSqlRawAsync返回值为SQL执行的受影响行数,并非存储过程的RETURN值或输出参数值,所以无论用户是否存在,都会返回执行操作对应的行数,导致结果始终为真。
  2. 调整后的代码存在三个问题:
    • EXEC语句未给输出参数添加OUTPUT关键字,SQL Server不会将计算结果回写到参数中,导致参数值为DBNull
    • 输出参数名称与存储过程定义的@EXIT不匹配,参数映射错误
    • 未处理DBNull的情况就直接强转为int,触发类型转换异常
  3. 存储过程无需额外导入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:57:01