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

今天在测试分布式数据库访问时,遇到异常: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将实体数据从服务器获取后,也不能加入到其它集合的.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值