摘自:http://blog.sina.com.cn/s/blog_14ecbd9250102wuz7.html
对于手动查询的界面可以在该界面类里单独打开一个连接
最近在软件开发过程中遇到了一个比较棘手的问题———“已有打开的与此命令相关联的 DataReader,必须首先将它关闭”,花了我一整晚时间才将它调试好,在这个期间我上网搜索了许多相关的解决方案,也做了相关的尝试,结果都是以失败告终,但是功夫不负有心人,总于在我百思不得其解的情况下,奇迹发生了!!!!
问题的由来:程序中有一个Timer控件用来实时判别数据库连接是否正常,如果不正常就得跳出一个对话框,告诉用户网络连接不正常,请重新配置,并停止用户当前的操作,这样就涉及到频繁连接数据的情况,那么当程序中还有另一个事件过程,当您触发该事件过程时,它同样也会不间断地连接数据库——如打印报告(word格式输出),这时就可能出现以上说的棘手问题,尤其是在程序中使用了DateReader 和 Command 对象 ,大家都知道这两个对象在连接数据库时,是不间断的,只有在数据操作完后才允许断开Connection对象,而且Command每次执行ExecuteNonQuery()方法之后,内部会生成一个空的DataReader对象,该对象只有在数据库连接关闭之后,才会被释放掉(这个我占时也不知道怎么解释,但事实证明,确实产生了)。
由于这个原因,当程序中只创建了一个公开变量Connection,那么当程序有两个线程同时占用它时,就会报错————“已有打开的与此命令相关联的 DataReader,必须首先将它关闭”,但是通过认真检查程序,你可能会发现程序中并未用到DateReader对象,而问题就是产生了!!!怎么办?????
思考了一下,难道和前面说的那样Command对象在运行期间生成了DateReader对象。。。。我自以为是这样,这也就算是找到了“祸源”了吧。这里有点小激动!!!!
归纳问题产生原因如下:
(1) 一个公开变量Connection;
(2) 同时以非断开式访问数据库;
(3) Command对象产生了Datereader对象;
解决方案也简单:创建两个及以上公开对象(也可以是不公开的)Connection,然后让涉及到同时操作数据库的Command对象分别调用各自的Connection,这样问题已经就可以解决了,不行试试!!!!