SSRS报表开发报错:An item with the same key has already been added
An item with the same key has already been added 我之前开发SSRS报表时也踩过这个一模一样的坑,折腾了好一会儿才理清常见的触发原因,给你整理了几个排查方向和解决办法:
重复的数据集字段名
这是最容易碰到的情况。如果你的数据集SQL查询返回了两个同名字段——比如关联表时不小心重复选中了同一个字段,或者给不同字段取了相同的别名——SSRS在解析数据集结构时就会抛出这个错误。
解决方法:仔细检查你的SQL语句,确保所有返回字段的名称(包括别名)都是唯一的。比如把重复字段删掉,或者给冲突的字段改个独特别名:SELECT t1.CustomerID, t2.CustomerID AS OrderCustomerID FROM Customers t1 JOIN Orders t2 ON t1.CustomerID = t2.CustomerID重复定义的报表参数
有时候会不小心在报表参数面板里创建了两个同名参数,或者在数据集参数映射时重复绑定了同一个参数名,这也会触发键重复的错误。
解决方法:打开报表的「参数」面板,逐个核对参数名称,删除重复的条目;同时检查每个数据集的参数映射设置,确保没有重复映射同一个参数名。分组/排序中的重复键字段
如果在报表的分组、排序或筛选规则里,重复添加了同一个字段作为键值(比如把同一个字段两次加入分组依据),SSRS处理时就会报这个错。
解决方法:进入报表设计的分组/排序设置界面,检查所有分组字段、排序字段,移除重复的条目即可。自定义代码中的字典重复键
要是你在报表里写了自定义C#代码,用到了Dictionary这类键值对集合,当尝试往集合里添加已存在的键时,就会抛出这个异常。
解决方法:打开报表的「报表属性」→「代码」标签,修改自定义代码,添加键之前先判断是否存在:private Dictionary<string, string> myDict = new Dictionary<string, string>(); public void AddItem(string key, string value) { if (!myDict.ContainsKey(key)) { myDict.Add(key, value); } }子报表/报表部件的命名冲突
如果你的报表引用了子报表或者报表部件,而这些子部件里有和主报表同名的参数、数据集字段,也可能导致键重复的冲突。
解决方法:检查子报表/报表部件的参数、数据集命名,确保和主报表没有重复;或者给冲突的名称加上前缀区分,比如把主报表的StartDate参数和子报表的Sub_StartDate参数区分开。
内容的提问来源于stack exchange,提问作者user10123643

