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

.NET 6调用SQL存储过程触发NullReferenceException问题求助

问题分析与解决

你的问题核心是存储过程返回值的获取逻辑不匹配:

  • 存储过程通过RETURN @Return返回的是SQL的返回代码(整数类型),但ExecuteScalar()的作用是读取查询结果集的第一行第一列数据。当存储过程没有输出结果集时,ExecuteScalar()会返回null,直接强转为bool就会触发空引用异常。
  • SSMS中执行正常是因为它会自动显示RETURN的返回值,但这和C#的API调用逻辑完全不同。

两种解决办法

办法一:修改存储过程,用SELECT输出结果集

把存储过程的结尾改成用SELECT返回值,让ExecuteScalar()能正确拿到数据:

IF (@d = @DOB)
BEGIN
       SELECT 1
END
ELSE
BEGIN
       SELECT 0
END
-- 移除原来的RETURN @Return语句

C#代码无需修改,(bool)cmd.ExecuteScalar()可以正常工作(SQL的1/0会自动转换为true/false)。

办法二:在C#中获取RETURN的返回代码

如果不想修改存储过程,就在C#代码里添加一个ReturnValue方向的参数来获取返回值:

using (var con1 = this.GetSqlConnection())
{
    bool result = false;
    try
    {
        SqlCommand cmd = new SqlCommand();
        cmd.CommandText = OnlinePaymentCheckNurseryChildSProc;
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Connection = con1;
        cmd.Parameters.AddRange(param);

        // 添加返回值参数,设置方向为ReturnValue
        var returnParam = new SqlParameter("@Return", SqlDbType.Int)
        {
            Direction = ParameterDirection.ReturnValue
        };
        cmd.Parameters.Add(returnParam);

        LogSqlParams(cmd.Parameters);
        con1.Open();

        // 无结果集时用ExecuteNonQuery执行存储过程
        cmd.ExecuteNonQuery();
        // 读取返回值并转换为bool类型
        int returnValue = (int)returnParam.Value;
        result = returnValue == 1;

        LogInfo(methodName, $"result=:{result}");
        LogInfo(methodName, $"Leaving:{methodName}");
        return result;
    }
    catch (Exception ex)
    {
        LogError(ex, methodName, "Trouble checking nursery child");
        return false;
    }
}

内容的提问来源于stack exchange,提问作者Rob Bowman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:55:19