美文网首页
出现了“另一个 SqlParameterCollection 中

出现了“另一个 SqlParameterCollection 中

作者: oo水桶oo | 来源:发表于2016-11-18 18:35 被阅读674次

出现了“另一个 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);

}

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

相关文章

  • 出现了“另一个 SqlParameterCollection 中

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

  • 另一个我出现了

    2022年学期结束送走了30多年教龄的,老教师光荣退休!看着幸福的走了!把自己的一辈子献给了教育事业!似乎也看到了...

  • 张悬,张悬

    有的时候莫名感觉,这个世界上不可能再出现另一个张悬了。 是的。也不会再出现另一个李宗盛,另一个罗大佑,还有张雨生,...

  • 出现了出现了,那个男人出现了。

    一声龙铃声从黑影中飞出,随后出来了两把剑。看着这两把剑凌天感觉到了熟悉。这不就那老头给的剑吗?怎么在魔法测试出出来...

  • 我有酒,你有故事吗

    “我有酒,你有故事吗?”记得初初看到这句话,好像身体中另一个自己出现了,记得宫崎骏曾经说过,这个世界上一定有另一个...

  • 一个梦

    我变成灵魂体,有人让我做坏事,迷茫中不想做坏事,被另一个人引导清醒。 出现了另一个灵魂体,也是那个人的手下,她很想...

  • 恋爱笔记(4):我为什么会喜欢另一个人

    在《爱情笔记》里说“我们一直在期待另一个人的出现,然后真实有那么一个人出现后,将想象中的人和现实结合,于是便开始了...

  • java.lang.ClassCastException: an

    出现原因: xml中更改布局,替换了父viewGroup,比如说从当前LinearLayout移动到另一个Rela...

  • 养成思考的好习惯,从自我做起

    有时当你在工作中解决了一个问题,另一个问题又接二连三的出现,因为这些原因让你很苦恼,让你陷入了问题的漩涡中。 为什...

  • UINavgationController容器中的storybo

    当在导航控制器容器push到另一个storyboard时,出现storyboard中的textView不能从第一行...

网友评论

      本文标题:出现了“另一个 SqlParameterCollection 中

      本文链接:https://www.haomeiwen.com/subject/lfrspttx.html