编写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
相关产品推荐
相关产品推荐

