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

编写Upsert订单条目方法触发NullReferenceException异常该如何解决?

NullReferenceException 排查与修复方案

System.NullReferenceException 抛出的根本原因是代码尝试访问了未实例化的空对象的属性、方法等成员,结合你提供的代码,触发报错的常见原因如下:

  • 方法入参OrderItem item为空:调用UpsertOrderItem时如果传入了null值,后续访问item.Description、item.Price等属性时会直接触发异常
  • sqlConn对象未完成实例化:如果sqlConn是类级别的字段,调用方法前没有为它赋值带有效连接字符串的SqlConnection实例,执行sqlConn.Open()时就会抛出空引用
  • 共享数据库对象存在线程安全问题:如果sqlConn、sqlCommand都是类级别共享字段,多线程同时调用该方法时,实例可能被其他线程修改或置空,也会触发异常
修复代码

推荐不要使用类级别的数据库连接、命令对象,每次方法调用单独创建实例,配合using语法自动释放资源,同时添加必要的空校验,修改后代码如下:

public int UpsertOrderItem(OrderItem item)
{
    // 先做入参空校验
    if (item == null)
        throw new ArgumentNullException(nameof(item), "订单条目参数不能为null");
    
    int result = 0;
    // 每次调用单独创建连接,替换为你自己的数据库连接字符串
    using (var sqlConn = new SqlConnection("你的数据库连接字符串"))
    {
        sqlConn.Open();
        // 用using包裹SqlCommand,执行完自动释放
        using (var sqlCommand = new SqlCommand("sp_UpsertOrderItem", sqlConn))
        {
            // 指定命令类型为存储过程,写法更规范
            sqlCommand.CommandType = System.Data.CommandType.StoredProcedure;
            sqlCommand.Parameters.AddWithValue("@description", item.Description);
            sqlCommand.Parameters.AddWithValue("@price", item.Price);
            sqlCommand.Parameters.AddWithValue("@quantity", item.Quantity);
            // 注意:如果你的存储过程还需要@OrderHeaderId、@StockItemId等参数,也要在这里补充添加
            result = sqlCommand.ExecuteNonQuery();
        }
    }
    return result;
}

额外提醒:你的OrderItem构造函数中没有给OrderHeaderId属性赋值,后续如果需要用到这个字段关联订单头,需要在构造函数中补充赋值逻辑。

内容的提问来源于stack exchange,提问作者Alex Jey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:24:02