ADO.Net(ODP.NET)执行命令时参数对象不能共用
2012-04-16 14:34
295 查看
今天在测试分布式数据库访问时,遇到异常:OracleParameter已在对象集合中,刚开始的时候还以为是重复添加的问题,经过多方测试还是有问题,后来将传入的参数克隆一份赋给命令参数,问题解决.后面觉得很奇怪,就去网上查了下,好像是这些参数对象不能同时添加到多个命令中,具体机制就不得而知了.但一个参数对象被添加到多个命令中,实际上都是指向同一份,对象还是同一个,如果ADO在底层会修改命令参数(返回值参数肯定得修改),那么不允许一个参数对象添加到多个命令中就很容易理解了.因为那样会造成混乱.
其实我无意中发现解决之道,是因为我的是多线程,我的想法是尽量将变量独立开,不共享,所以无意走对了路.
PS:学习在出错中进步,有出错才有未来!
补充:想起来了,其实这种规则在Silverlight将实体数据从服务器获取后,也不能加入到其它集合的.
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 执行sql命令
- ADO.NET 2.0中的异步命令执行
- 执行数据库命令(Command对象)——ADO.NET学习&应用笔记之三
- 黑马程序员之ADO.NET学习笔记:SqlCommand(命令对象)
- ADO.NET 快速入门(二):执行命令
- ADO.NET中不能把0作为值传给SQL参数?
- ADO.NET 快速入门(二):执行命令
- ADO.NET的新功能:MARS(Multiple Active Result Set) 及 异步执行命令
- ADO.Net命令执行方式比较
- 参数化使用ADO.NET的OleDb方法时注意不能使用@参数
- vs.net2003中DataGrid执行Command命令有时不能被执行的问题
- ADO.NET 2.0中的异步命令执行
- 使用ADO.NET执行带参数的Sql语句
- ADO.NET 快速入门(二):执行命令
- ADO.NET:(2) 执行命令
- ADO.Net的四大对象及参数-总结
- (原) ODP.NET 演示以输出参数的形式获取Clob对象
- ADO.NET(二)执行命令
- ADO.NET 1创建连接、执行命令