首页 > 其他分享 >DataReader 链接关闭解惑篇

DataReader 链接关闭解惑篇

时间:2022-09-29 23:05:42浏览次数:80  
标签:控件 DataReader ._ 关闭 reader 解惑 链接

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

 

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

 

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

 

示例代码:

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

结论是:

False
Open

 

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

 

情况二:DataReader 链接已关闭

 

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

       

protected void bind()
{
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["constr"].ToString());
conn.Open();
SqlCommand cmd = new SqlCommand("GetAllUser", conn);
SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
repeater1.DataSource = sdr;
repeater1.DataBind();
Response.Write(sdr.IsClosed.ToString() + "<br/>");
Response.Write(conn.State.ToString());
}

结果是:

True

Closed

 

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

 

三:分析原因

 

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

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

 

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

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

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

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

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

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

    public DbEnumerator(IDataReader reader, bool closeReader)
    {
        if (reader == null)
        {
            throw ADP.ArgumentNull("reader");
        }
        this._reader = reader;
        this.closeReader = closeReader;//此行设置了标志
    }

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

 

public bool MoveNext()
{
if (this._schemaInfo == null)
{
this.BuildSchemaInfo();
}
this._current = null;
if (this._reader.Read())//此方法被调用一次,就读一次
{
object[] values = new object[this._schemaInfo.Length];
this._reader.GetValues(values);
this._current = new DataRecordInternal(this._schemaInfo, values, this._descriptors, this._fieldNameLookup);
return true;//有数据时直接返回,不会执行下面的关闭链接
}
if (this.closeReader)//好,能进行这里,说明上面读不到数据,简说就是数据读完了
{
this._reader.Close();//关闭链接操作。
}
return false;
}

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

 

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

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

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

 

四:最终结论是什么?

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

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

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

 

好了,打完收工,希望对大伙有所帮助。

标签:控件,DataReader,._,关闭,reader,解惑,链接
From: https://blog.51cto.com/cyq1162/5724358

相关文章

  • 8. HTML-- 超链接标签<a>
    1.前言在HTML中,我们使用<a>标签来表示超链接。超链接(Hyperlink)通常简称为链接(Link),是指从一个网页指向另一个目标的连接关系,这个目标可以是另一个网页,也可以是当前网......
  • [答疑]如何将一个用例链接到它对应的序列图上
    李秀涛(89***24)13:08:50EA中是如何将一个用例链接到它对应的序列图上的?李秀涛(89***324)13:09:09就是怎么达到双击用例,跳转到所对应的序列图月黑风高(124***293)14:19:0......
  • wiki 超链接
    LINKSMarkdownsupportstwostyleoflinks: inline and reference.Inbothstyles,thelinktextisdelimitedby[squarebrackets].Tocreateaninlinelink,......
  • 关于python3导出excel图片链接转图片且图片内嵌表格内实现
    fromopenpyxlimportWorkbook,load_workbookfromopenpyxl.drawing.imageimportImagefromopenpyxl.drawing.spreadsheet_drawingimportAnchorMarker,TwoCellAnc......
  • 6、C++ 静态编译链接使用库,及例子libfacedetection人脸识别应用
    直接上例子:存在三个文件 example.cpp中的文件#include<iostream>#include"function.h"usingnamespacestd;intfun(inta,intb);intmain(){cout<<fun(2,3)<<endl;cout<<......
  • 链接服务器读取Mysql---出现消息 7347,级别 16,状态 1,第 13 行 链接服务器 '****' 的 OL
    可以毫不夸张的说:“网上所有搜索出来的答案,都没有解决我的问题”,我是采用以下的方式处理此异常,借此宝地mark一下  今天使用链接服务器查询Mysql数据库时,出现以下问题......
  • 简单看懂编译链接
    在这里,我想任何人做编程相关的人都应该至少接触过某种编程语言,接触过程序的编译,执行过自己源代码产生的可执行文件。对于可执行文件我想不得不提需要关心的应该直接首先是......
  • 微信小程序中图片链接缓存问题如何解决
    背景描述:更换阿里云上面的图片库,打开小程序后,发现界面展示的图片还是旧图片。原因:是由于缓存导致的。解决方案:1.可以给对象存储OSS设置资源的HTTP响应头即可......
  • Hbuilderx中mac链接android模拟器
    1、打开了mumu模拟器。2、hBuilderX=>运行=>abd路径设置=>只需要填写android模拟器端口7555(网易mumu模拟器对应的,每个模拟器有自己的,具体查看文档)3、./adbki......
  • 链接sql数据库
    //windows验证方式stringconnectionStringTest=@"DataSource=ADMINISTRATOR\SQLEXPRESS;InitialCatalog=TestDB;IntegratedSecurity=SSPI;";//建立信任连接(具体含......