DataReader总结
DataReader使用流的方式读取输出数据,所以速度会比较快,因此经常会被用到,但是问题同时经常有人在使用完成以后忘记关闭DataReader或者是不知道在什么时候关闭。这里我们详细说一下DataReader的关闭。
首先添加配置:
XML 代码
<appSettings>
<add key="DefaultSqlConnectionStri
</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