向高手求教:返回SqlDataReader的函数里,何时关闭SqlConnection

今天下午,朋友在QQ上对我说他的代码调试出错了,但找不到具体原因。该问题在VS2008下报错的详细信息如下:
异常详细信息: System.InvalidOperationException: 阅读器关闭时尝试调用 Read 无效。
根据我个人的一点点经验,我觉得是他在打开SqlDataReader之前,编写了关闭SqlDataReader的代码。但这仅仅是猜测,我让他把代码发过来给我看看。原来,他页面上的代码是这样写的:

Code

bind()函数所调用的ExceRead(string SqlCom)函数代码如下:

Code

后来我问他,sysConfig这个表里面有没有数据呢?他说有。
其实解决问题的办法很简单,百度一下,找到相关的解决办法以及出错原理:

DataReader相当于一个只能向前的读取器,在读取的时候你不能con.Close()。也就是说,只要在ExceRead(string SqlCom)函数中将两行con.Close()注释掉,错误就不会出现了。修正后的ExceRead(string SqlCom)函数为:

Code

请注意:我刚才只是说错误不会再出现了,而没有说问题已经完美解决了。
至此,我产生了一个疑问:ExceRead(string SqlCom)函数中,去掉了关闭数据库连接的代码,而调用该函数的地方(在这里是bind()函数)也无法编写关闭连接的代码,那么,这个连接到底要等到什么时候才会被被关闭呢?如果一个系统中,有上百上千处的调用ExceRead(string SqlCom)函数,那就会导致数据库连接超过最大限制,从而导致系统崩溃了?
还请各位高手赐教。感激不尽!

另外,在博客园和CSDN论坛上找到了另外两个相似的解决办法:

一、使用CommandBehavior.CloseConnection: 

Code

 二、是把读出的数据放在一个IList里面,然后返回。
不知道上述两个方法能否完美的解决这个问题。

你可能感兴趣的:(Connection)