最近项目上遇到一个很奇怪的问题,查询经常性的出错,这种出错是间歇性的。比如在代码中写select column1 from talbe1。执行完毕后Fill一个DataSet,再访问DataSet中的Table和Row以及Column。通常会有一些莫名其妙的错误,例如
Can not find Table 0.
Column "column1" dose not belong to Table table.
在大多数情况下,没有任何问题,但是程序运行一会儿(不定期),就会出现这个问题。过一会儿可能也好了,但是几十分钟或几个小时后又出现了。
经过种种分析、排除,查找原因,最后把问题确定在connection.Close()的上。
SqlConnection.Close Method
CAUTION Do not call Close or Dispose on a Connection, a DataReader, or any other managed object in the Finalize method of your class. In a finalizer, you should only releaseunmanaged resources that your class owns directly. If your class does not own any unmanaged resources, do not include a Finalize method in your class definition. For more information, see Programming for Garbage Collection.
MSDN中文的链接,上面链接失效了。
http://blog.csdn.net/marising/archive/2009/03/26/4027135.aspx
根据这个文章,我们注释了log(日志记录)处的Finalize中的connection的close方法。问题得以解决,但是其原理百思不得其解。
最后,再提醒一下大家,DataReader要记得关闭,否则也会出一些问题。
------------------------------------------------------------------------------------------------------------------------------------------
总结一下
1.不要在Finalize中调用 Ado.net Connection和 DataReader的 Close或者 Dispose方法。
2.在程序中,要确保Connection和DataReader及时关闭,使用如 try catch finally或者 using。
3.在 Asp.net中, 切勿使用Static的 Connection。
对于原因,我的猜想:ado.net已经作了数据库连接的缓存,在.net程序中关闭一个ado.net的连接,并没有真正的关闭数据库连接,它很可能再将这个连接分配给其他的线程;而asp.net是多线程的,如多个线程共用一个连接,会出现冲突,而冲突就会出现上面的问题。