出现了“另一个 SqlParameterCollection 中已包含 SqlParameter”异常

出现了“另一个 SqlParameterCollection 中已包含 SqlParameter”异常


方法一,

网上大部分都是这个方法

具体原因:声明的SqlParameter数组,而在循环的内部,每一次执行ExecuteNonQuery都由该方法内部的IDbCommand.Parameters.Add(IDbDataParameter)将SqlParameter数组添加到IDbCommand的IDataParameterCollection中。而framework机制限制两个IDataParameterCollection指向同一个对象。虽然ExecuteNonQuery方法内部声明了一个IDbCommand的临时对象,理论上讲,这个包含了IDataParameterCollection的IDbCommand对象会在ExecuteNonQuery方法结束时从内存中释放。但是实际上可能是由于垃圾回收机制并没有将IDbCommand临时对象即时的回收,而且改对象绑定的Parameter集合也存在,就像一个DropDownList添加Item一样。这样在下一个循环执行的时候,会导致两个IDataParameterCollection指向同一个对象,此时出现问题。项目中使用了把命令字符串传入到数据操作类中的数据库操作方式,今天看到使用直接在命令字符串中包含参数可能会造成SQL注入漏洞,于是想把命令字符串改成用参数传入的方式,即select * from member whereid=@ID,然后传SqlParameter数组(有几个SqlParameter数组就有几个元素)到数据库操作方法,也就是比原来直接传值的方式多传一个数组。然后传上的这个数组再在数据库操作方法中这样写

解决方案一:在每一次循环时,重新生成对象,

prams = new SqlParameter[] { db.MakeInParam("@id", SqlDbType.VarChar, 0, id) };

但这样会产生大量的垃圾变量,不可取。

解决方案二:将使用完之后的Command命令的Parameters集合清空。

PrepareCommand(cmd, con, cmdText, cmdParms);

count= Bmc.CLUtility.getConvertIntValue(cmd.ExecuteScalar());

cmd.Parameters.Clear();

第二种方法最佳,可恨我一直在使用第一种方法 。

for(int i=0;isqlCom.Parameters.add(paramArr[i]);

}


方法二,

这样写本来以为就能够直接把参数传过去了,没想到一运行竟然提示出了“另一个 SqlParameterCollection 中已包含 SqlParameter”异常,用了几种方法试了一下都不能完全解决,在网上查了一下发现这种方法很易用,而且用了以后网站确实正常了。代码如下:

foreach (SqlParameter p in paramArr){

SqlParameter pp = (SqlParameter)((ICloneable)p).Clone();

sqlCom.Parameters.Add(pp);

}

这样就能同时更新两个表/数据库中的数据了;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,798评论 19 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,901评论 6 13
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,568评论 0 4
  • 四月 面朝落日 便生出余晖在喉 人在傍晚 就像草木立在枯河里 两条腿硬梆梆地 钻在城市的虚妄里 掘着嫩绿的魂灵 四...
    归舴阅读 1,547评论 5 2
  • 互联网时代的到来给了年轻人一条真正的公平竞争之路,即使你的阶层和起点不够好,只要你具有能在网络中识别高级心智的能力...
    狷狂三斧阅读 7,042评论 29 96