ADO.Net(ODP.NET)执行命令时参数对象不能共用

ADO.Net(ODP.NET)执行命令时参数对象不能共用,第1张

概述今天在测试分布式数据库访问时,遇到异常:OracleParameter已在对象集合中,刚开始的时候还以为是重复添加的问题,经过多方测试还是有问题,后来将传入的参数克隆一份赋给命令参数,问题解决.后面觉得很奇怪,就去网上查了下,好像是这些参数对象不能同时添加到多个命令中,具体机制就不得而知了.但一个参数对象被添加到多个命令中,实际上都是指向同一份,对象还是同一个,如果ADO在底层会修改命令参数(返回

今天在测试分布式数据库访问时,遇到异常:OracleParameter已在对象集合中,刚开始的时候还以为是重复添加的问题,经过多方测试还是有问题,后来将传入的参数克隆一份赋给命令参数,问题解决.后面觉得很奇怪,就去网上查了下,好像是这些参数对象不能同时添加到多个命令中,具体机制就不得而知了.但一个参数对象被添加到多个命令中,实际上都是指向同一份,对象还是同一个,如果ADO在底层会修改命令参数(返回值参数肯定得修改),那么不允许一个参数对象添加到多个命令中就很容易理解了.因为那样会造成混乱.

 private voID PrepareCommand(OracleCommand Command,OracleParameter[] Parameters,OracleTransaction Trans)        {            try            {                Command.Parameters.Clear();                if (Parameters != null)                {                    foreach (var p in Parameters)                    {                        //这是正确安全的写法                        OracleParameter theP = ((ICloneable)p).Clone() as OracleParameter;                        Command.Parameters.Add(theP);                        //Command.Parameters.Add(p); //这是不安全的写法.                    }                }                if (Trans != null)                {                    Command.Transaction = Trans;                }            }            catch            {            }        }

上面的try,catch在实际中应该除掉,我写这个是为了抓虫子!
其实我无意中发现解决之道,是因为我的是多线程,我的想法是尽量将变量独立开,不共享,所以无意走对了路.

PS:学习在出错中进步,有出错才有未来!

补充:想起来了,其实这种规则在Silverlight将实体数据从服务器获取后,也不能加入到其它集合的.

总结

以上是内存溢出为你收集整理的ADO.Net(ODP.NET)执行命令时参数对象不能共用全部内容,希望文章能够帮你解决ADO.Net(ODP.NET)执行命令时参数对象不能共用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1068704.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存