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

