DataReader链接关闭解惑篇

看到有帖子:DataReader的关闭问题疑惑篇 ,大伙对链接关闭问题看似比较迷惑,这里就给解说一下:

不管是啥xxDataReader,都是继承DataReader实现的,所以是有共性的,因此标题就以DataReader为题了。

情况一:DataReader 默认链接不关闭

示例代码:

  1. static void Main(string[] args)  
  2. {  
  3.     SqlConnection con = new SqlConnection("server=.;database=MySpace;uid=sa;pwd=123456");  
  4.     con.Open();  
  5.     SqlCommand com = new SqlCommand("select top 1 id from blog_user",con);  
  6.     SqlDataReader sdr = com.ExecuteReader(System.Data.CommandBehavior.CloseConnection);  
  7.     while (sdr.Read())  
  8.     {  
  9.     }  
  10.     Console.WriteLine(sdr.IsClosed);  
  11.     Console.WriteLine(con.State.ToString());  
  12.     Console.ReadLine();  

结论是:

False

Open

说明:默认无论是不是加System.Data.CommandBehavior.CloseConnection,读取时数据库链接不会帮你关闭。

情况二:DataReader 链接已关闭

示例代码:[以下是原文的代码]

  1. protected void bind()  
  2. {  
  3.     SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["constr"].ToString());  
  4.     conn.Open();  
  5.     SqlCommand cmd = new SqlCommand("GetAllUser", conn);  
  6.     SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);  
  7.     repeater1.DataSource = sdr;  
  8.     repeater1.DataBind();  
  9.     Response.Write(sdr.IsClosed.ToString() + "<br/>");  
  10.     Response.Write(conn.State.ToString());  
  11. }  

结果是:

True

Closed

情况:System.Data.CommandBehavior.CloseConnection加完之后,链接给你关闭了,为啥?看下面的分析原因。

三:分析原因

1:从前面的两个示例上看,区别是什么?

答:区别就在于一个只读数据,另一个绑定了数据列表控件。

2:为什么绑定了数据列表控件就会自动关闭链接?

答:这就涉及到数据控件绑定机制了,这里给大伙简单介绍一下:

A:要实现数据控件列表绑定,有一个接口是需要实现的:IEnumerable

B:实现DataReader实现此接口的代码[基类是抽象方法,所以只能到子类SqlDataReader查看]:

  1. public override IEnumerator GetEnumerator()  
  2. {  
  3.     return new DbEnumerator(this, (this._commandBehavior & CommandBehavior.CloseConnection) ==     CommandBehavior.CloseConnection);  
  4. }  

从这代码里,我们只看到了它把CloseConnection传进DbEnumerator里了,再进去看一下:

  1. public DbEnumerator(IDataReader reader, bool closeReader)  
  2. {  
  3.     if (reader == null)  
  4.     {  
  5.         throw ADP.ArgumentNull("reader");  
  6.     }  
  7.     this._reader = reader;  
  8.     this.closeReader = closeReader;//此行设置了标志  
  9. }  

点进去只看到构造函数,并把它赋给this.closeReader属性,因为DataReader是向前读方式,所以重点还是要看其中的一个方法MoveNext:

  1. public bool MoveNext()  
  2. {  
  3.     if (this._schemaInfo == null)  
  4.     {  
  5.         this.BuildSchemaInfo();  
  6.     }  
  7.     this._current = null;  
  8.     if (this._reader.Read())//此方法被调用一次,就读一次  
  9.     {  
  10.         object[] values = new object[this._schemaInfo.Length];  
  11.         this._reader.GetValues(values);  
  12.         this._current = new DataRecordInternal(this._schemaInfo, values, this._descriptors, this._fieldNameLookup);  
  13.         return true;//有数据时直接返回,不会执行下面的关闭链接  
  14.     }  
  15.     if (this.closeReader)//好,能进行这里,说明上面读不到数据,简说就是数据读完了  
  16.     {  
  17.         this._reader.Close();//关闭链接操作。  
  18.     }  
  19.     return false;  
  20. }  

以上代码就看我注释的说明。

C:为什么用DataReader绑定列表控件是耍流氓?

答:因为服务端控件列表渲染出表格的周期通常比较长,所以,只有等到你看到最后结果列表出来的时候,最后一行数据才读完。

因此链接是持续相当长的处于打开状态,所以web这种并发多的情况,狂点几下,估计就报错了,链接池用满了。

四:最终结论是什么?

1:在绑定列表控件时,只要数据行读取完毕,就会自动关闭链接。

2:在直接读取时,不会触发绑定相关的读取,所以不会自动关闭链接。

3:在绑定列表控件时,链接长期得不到关闭,并发一来,就挂了,因此大伙就不要耍流氓了。

原文链接: http://www.cnblogs.com/cyq1162/archive/2011/04/06/2006412.html

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/265947.html<

(0)
运维的头像运维
上一篇2025-05-05 17:47
下一篇 2025-05-05 17:48

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注