现在的位置: 首页 > 综合 > 正文

DataReader总结

2012年10月11日 ⁄ 综合 ⁄ 共 1439字 ⁄ 字号 评论关闭

DataReader使用流的方式读取输出数据,所以速度会比较快,因此经常会被用到,但是问题同时经常有人在使用完成以后忘记关闭DataReader或者是不知道在什么时候关闭。这里我们详细说一下DataReader的关闭。

首先添加配置:

XML 代码
<appSettings>
<add key="DefaultSqlConnectionString" value="SERVER=.;DATABASE=test;UID=sa;PWD=123456;Connection Reset=false;Min Pool Size=1;Max Pool Size=2"/>
</appSettings>

从配置中,我们可以知道最大允许两个连接,超过两个将会报错。

读取数据函数:

cmd.ExecuteReader(string strsql) ,返回 SqlDataReader 。这里我们就不给详细的写法了。

测试一:

C# 代码
SqlDataReader dr = cmd.ExecuteReader("select * from Ip where id=0");
if (dr.HasRows)
{
dr.Close();
dr.Dispose();
}

这里主要是有的同事认为只在dr有数据时才需要关闭,经测试错,当页面刷新两次报错,连接池已满。实际上此时,无论有无数据,datareader已建立一个连接,只是数据为Empty,dr对象不是null,占用的连接在使用完成必须释放:

正确:

C# 代码
SqlDataReader dr = cmd.ExecuteReader("select * from Ip where id=0");
if (dr.HasRows)
{
//读取数据
}
dr.Close();
dr.Dispose();

测试二:多次连接使用同一个datareader

C# 代码
SqlDataReader dr = cmd.ExecuteReader("select * from Ip where id=0");
dr = cmd.ExecuteReader("select * from Ip where id=-1");
dr = cmd.ExecuteReader("select * from Ip where id=-2");
dr.Close();
dr.Dispose();

有人认为共用一个datareader将会只建立一次链接,因此建立该测试,测试证明在运行是,报错: dr = cmd.ExecuteReader("select * from Ip where id=-2"); 说明执行到这里时连接池已满,没有空闲连接供它使用。因为前面两个查询已占用了两个连接,并没有释放。

因此正确的做法是datareader使用完成必须单独关闭:

C# 代码
SqlDataReader dr = cmd.ExecuteReader("select * from Ip where id=0");
dr.Close();
dr.Dispose();
dr = cmd.ExecuteReader("select * from Ip where id=-1");
dr.Close();
dr.Dispose();
dr = cmd.ExecuteReader("select * from Ip where id=-2");
dr.Close();
dr.Dispose();

总结:DataReader虽然速度快,但是一定要注意每次使用后必须记得关闭。

本篇文章来源于 http://www.shenjk.com/ 原文链接:http://www.shenjk.com/details/643.html

抱歉!评论已关闭.