执行Oracle操作时报OracleParameter已被包含在集合中错误原因排查
错误原因分析
- 核心原因是同一个
OracleParameter实例不允许被添加到多个OracleParameterCollection集合中,你的代码逻辑触发了这个规则:- 你将参数列表
parametersList的初始化放在了foreach循环外部,整个循环过程中复用的是同一个列表对象 - 第一次循环时,你往列表中添加了第一个参数对象,调用
ExecuteQuery方法时该参数被添加到本次执行生成的OracleCommand的参数集合中,此时这个参数实例已经和该集合绑定 - 第二次及之后的循环中,你往同一个列表追加新参数后再次传入
ExecuteQuery,方法会遍历列表中的所有参数(包括之前已经绑定过旧集合的参数实例),尝试将它们添加到新的OracleCommand的参数集合中,直接触发报错
- 你将参数列表
修复方案
最简单的修复方式是将参数列表的初始化逻辑移入循环内部,每次循环生成独立的参数列表,避免复用已经绑定过集合的参数实例:
if (items != null) { foreach (string item in items) { var parametersList = new List<OracleParameter>(); parametersList.Add(new OracleParameter("@item", item)); ExecuteQuery("sp_submitItem", parametersList); } }
如果确实需要复用参数列表,也可以在每次调用ExecuteQuery之后清空列表,同时调用已使用的参数实例的Reset()方法解除和旧参数集合的绑定,不过该方式容易遗漏操作引发其他问题,更推荐第一种方案。
内容的提问来源于stack exchange,提问作者beginnermakingmistakes
相关产品推荐
相关产品推荐

