关于CommandBehavior.CloseConnection

 SqlDataReader reader = command.ExcecuteReader(CommandBehavior.CloseConnection);

重点在这个SqlDataReader的CommandBehavior.CloseConnection。

这个reader一般是作为一个static返回值的,这里是ExecuteReader的一个重载。很多人都误以为只要使用上述的语句connection就会自动关闭的。包括我在一些商业软件居然也看到了这样的代码,结果造成了连接池溢出,系统瘫痪。

关于CommandBehavior.CloseConnection,网上实是在有太多的错误。居然没有人去认真的code一下,大都数网摘都来自于一篇cnblogs上的文章。很多的网友估计是看都没有看清楚,连同文章和评论一同都转载了。

早先的MSDN上对CommandBehavior的说明实在是太过于简单:CloseConnection在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭。 

在VS2005的MSDN帮助中写到:如果您使用 SQL Server 2005 之前的 SQL Server 版本,在使用 SqlDataReader 时,关联的 SqlConnection 将忙于为 SqlDataReader 服务。当处于此状态时,除了关闭 SqlConnection 外,不能对其执行其他任何操作。在调用 SqlDataReader.Close 方法之前一直如此。如果创建了 SqlDataReader 并将 CommandBehavior 设置为 CloseConnection,则关闭 SqlDataReader 会自动关闭此连接。从 SQL Server 2005 开始,多活动结果集 (MARS) 功能允许多个操作使用同一连接。

估计是很多人都忽略了“则关闭 SqlDataReader 会自动关闭此连接”这段的文字。

经过程序测试发现,如果不显式的调用reder.Close()方法,则该reader 的connection会一直何持open状态。

因此,在使用完reader后,还是应该加上reader.close();这样系统会自动关闭支持reader活动的connection。

你可能感兴趣的:(C#)