通过数据库上下文向SQL Server存储过程传递空DataTable报错如何解决
问题根因
你遇到的报错是ADO.NET和SQL Server对表值参数的固定限制导致的:
- 自定义表类型作为参数传递时,哪怕没有数据,也必须携带和类型定义完全匹配的列结构,不能是无列的空DataTable
- 表值参数不支持
null或DBNull.Value作为入参,有效值只能是符合结构要求的DataTable、DataReader或实现了IEnumerable的对象
解决方法
1. 修复GetTypes方法,统一保留表结构
无论传入的typeList是否为空,都先创建和[brs].StringListType完全匹配的列结构,空场景下直接返回0行的结构化DataTable即可:
private DataTable GetTypes(List<string> typeList) { // 提前创建和自定义表类型结构一致的DataTable var typeTable = new DataTable(); typeTable.Columns.Add("Type", typeof(string)); // 仅当有有效数据时添加行 if (typeList != null && typeList.Count > 0) { foreach (var typeStr in typeList) { typeTable.Rows.Add(typeStr); } } return typeTable; }
2. 补充存储过程入参
你提到存储过程共接收6个参数,当前代码仅传递了@rt_AppList,请补充剩余5个参数的赋值和传递逻辑,否则执行时会触发参数不匹配的报错。
3. 可选:存储过程适配空表逻辑
如果需要在表值参数为空时走特殊业务逻辑,可以在存储过程中判断行数即可:
IF (SELECT COUNT(1) FROM @rt_AppList) = 0 BEGIN -- 空表对应逻辑 END ELSE BEGIN -- 有数据对应逻辑 END
内容的提问来源于stack exchange,提问作者sajesh Nambiar
相关产品推荐
相关产品推荐

