另一个SqlParameterCollection中已包含SqlParameter

来源:互联网 发布:淘宝自动下架的原因 编辑:程序博客网 时间:2024/06/18 08:19

一般情况下,我们定义的一个SqlParameter参数数组,如:

            SqlParameter[] parms =             {                new SqlParameter("@Date", date),                new SqlParameter("@Time", time)            };

如果只给一个SqlCommand使用,这种情况的参数使用,不会出现异常,但如果该参数数组同时给两个Sqlcommand使用,就会出现如下异常:
  System.ArgumentException: 另一个SqlParameterCollection中已包含SqlParameter。
  
原因如下:
声明的SqlParameter数组,而在循环的内部,每一次执行ExecuteNonQuery(或者其它命令方法)都由该方法内部的IDbCommand.Parameters.Add(IDbDataParameter)将SqlParameter数组添加到IDbCommand的IDataParameterCollection中。而framework机制限制两个IDataParameterCollection指向同一个对象。虽然ExecuteNonQuery方法内部声明了一个IDbCommand的临时对象,理论上讲,这个包含了IDataParameterCollection的IDbCommand对象会在ExecuteNonQuery方法结束时从内存中释放。但是实际上可能是由于垃圾回收机制并没有将IDbCommand临时对象即时的回收,而且改对象绑定的Parameter集合也存在,就像一个DropDownList添加Item一样。这样在下一个循环执行的时候,会导致两个IDataParameterCollection指向同一个对象,此时出现问题。

解决方案一:在每一次循环时,重新生成对象,但这样会产生大量的垃圾变量,不可取。

解决方案二:将使用完之后的Command命令的Parameters集合清空。推荐使用,类似代码如下:

        /// <summary>        /// 获取一个DataTable        /// </summary>        public static DataTable GetDataTable(            string connDBStr, string sql, params SqlParameter[] cmdParms)        {            SqlCommand cmd = new SqlCommand();            using (SqlConnection conn = new SqlConnection(connDBStr))            {                PrepareSqlCommand(cmd, conn, null, sql, cmdParms);                SqlDataAdapter da = new SqlDataAdapter(cmd);                DataTable dt = new DataTable    (SetSqlAsDataTableName(sql));                da.Fill(dt);                cmd.Parameters.Clear();//多了这一句,就解决了问题                return dt;            }        }

另外,如果不是数组,只是一个SqlParameter变量,如:

            SqlParameter parm =                 new SqlParameter("@Cust_Id", CustId.Trim());;

则多次被SqlCommand使用,不会出现问题,我已经做了试验!

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 TwoPermutations 发布订阅 发布订阅模式 eeee 大富翁python Sicily guoshanche Sicily过山车 SALESFORCE D Avengerendgame Avengerendgame 水晶報表 Granfurniture Granfurniture Granfurniture brokenimg brokenimg brokenimg pdnanalyzer PDNAnalyzer 电话轰 YUVA 给在读研究生 横手 labwindow labwindowcvi PERFORMANCEWARNING:OverlappingonDeckSearchers=2 PERFORMANCEWARNING:OverlappingonDeckSearchers=2 SolrPERFORMANCEWARNING:OverlappingonDeckSearchers= solr报错PERFORMANCEWARNING:OverlappingonDeckSearcher solr报错PERFORMANCEWARNING:OverlappingonDeckSearcher solr报错PERFORMANCEWARNING:OverlappingonDeckSearcher 我想做一个能在你的葬礼上描述你一生的人epub 和你在一起才是全世界 DOM7011:此页上的代码禁用了反向和正向缓存 jvm 教程 开奖修复 4个人做4份工作,一个人只能做一份工作,一个工作只需要一个人去做,4个人的工作效率如下表。则最佳安排 4个人做4份工作,一个人只能做一份工作,一个工作只需要一个人去做,4个人的工作效率如下表。则最佳安排