调用存储过程checkClientAccess提示未提供@AccessCode参数问题排查
问题根因
你遇到的报错是参数绑定失败导致传给存储过程的参数为空,核心有两处问题:
- 前后端传参字段名不匹配:前端POST的JSON结构是
{"inputCode": "xxx"},但后端checkClientAccess接口接收的Models.clientAccess类的属性是accessCode,字段名不对应导致Web API无法完成参数绑定,client.accessCode实际取到的值为null - ADO.NET参数传递规则问题:当传入的
inputCode为null时,直接给SqlParameter赋值null会被ADO.NET视为未传参,需要显式替换为数据库可识别的空值对象
解决方案
第一步:统一前后端传参字段名(解决核心绑定问题)
修改前端POST对象的字段名,和后端模型属性名保持一致即可:
// 把原来的postObj定义修改为 var postObj = { accessCode: accessCode };
如果你不想修改前端代码,也可以直接修改后端Models.clientAccess类的属性名为inputCode,两边字段名一致即可正常完成参数绑定。
第二步:优化ADO.NET存储过程参数赋值逻辑(兜底兼容空值场景)
修改ExecuteSPcheckClientAccess方法里的参数添加代码,兼容空值场景,避免偶发空值触发同类报错:
// 替换原来的参数添加代码 cmd.Parameters.Add(new SqlParameter("@AccessCode", inputCode ?? (object)DBNull.Value));
修改后就算inputCode为null,也会显式传入数据库识别的空值,不会被判定为未提供参数。
验证方法
修改完成后可以在API接口checkClientAccess第一行加断点或者本地日志,打印client.accessCode的值,确认能正常接收到前端传的参数即可。
内容的提问来源于stack exchange,提问作者Mike Aiello
相关产品推荐
相关产品推荐

