ADO.NET(三) 连接池、Command、DataReader
2013-11-23 14:29
387 查看
一、连接池
虽然请求链接耗时很短,但是确实是需要时间的。一般使用连接池来优化,链接池保持已经打开的数据库链接,这些链接使用相同数据源之间的会话共享。这样就省下了不断
创建和销毁链接的时间了。ADO.NET中连接池对开发者完全透明,数据访问代码不需要做任何修改,当客户端调用Open()方法请求打开链接时,如果连接池中有此链接,链接直接从连接池中取而不是再次创建。当客户端调用Close()或者Dispose()方法时,并没有真正销毁链接,而是将链接放在链接池中,等待下次调用。
ADO.NET本身并不包含任何连接池的机制,不过大部分的提供程序都实现了各自高效的连接池算法。这些算法由托管代码实现。
我们一般用的SQL Server和Oracle都是自动使用连接池。我们可以配置一些连接池的属性。
![](http://img.blog.csdn.net/20131123143257953?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDU4Njg0Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
如你可以这样配置:
Command类可以执行所有类型的SQL语句,虽然它可以执行DDL但是我们一般只用它来执行DML
使用命令前我们可以选择命令类型,设置命令文本并把命令绑定到链接上,可以通过设定相应的属性(CommandType CommandType 和Connection)来
设置这一切。或者把他们作为构造函数的额参数传递
命令可以是一条sql语句、一个存储过程或者某个表的名字,这依赖于你正在使用的命令类型。
![](http://img.blog.csdn.net/20131123143322437?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDU4Njg0Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
Command提供3个常用的方法来执行命令
![](http://img.blog.csdn.net/20131123143340015?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDU4Njg0Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
DataReader 允许你以只进、只读流的方式每次读取一条select语句命令返回的记录。下面是它提供的一些方法
![](http://img.blog.csdn.net/20131123143402328?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDU4Njg0Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
下面一个简单的demo来介绍如何使用DataReader
首先配置链接字符串:
我用的oracle,服务器在本机,简单的在web.config配置下connectionStrings
然后后台:
最后得到结果
![](http://img.blog.csdn.net/20131123142939968?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDU4Njg0Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
我们还可以将DataReader直接绑定到GridView上
![](http://img.blog.csdn.net/20131123150613921?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDU4Njg0Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
当然DataReader 不止能返回一个结果集,它有可能执行存储过程或者是用分号隔开的多个查询语句,这时但会多个结果集可以用NextReader()方法加上Read()方法遍历所有
结果集。
虽然请求链接耗时很短,但是确实是需要时间的。一般使用连接池来优化,链接池保持已经打开的数据库链接,这些链接使用相同数据源之间的会话共享。这样就省下了不断
创建和销毁链接的时间了。ADO.NET中连接池对开发者完全透明,数据访问代码不需要做任何修改,当客户端调用Open()方法请求打开链接时,如果连接池中有此链接,链接直接从连接池中取而不是再次创建。当客户端调用Close()或者Dispose()方法时,并没有真正销毁链接,而是将链接放在链接池中,等待下次调用。
ADO.NET本身并不包含任何连接池的机制,不过大部分的提供程序都实现了各自高效的连接池算法。这些算法由托管代码实现。
我们一般用的SQL Server和Oracle都是自动使用连接池。我们可以配置一些连接池的属性。
如你可以这样配置:
<connectionStrings> <add name="MyTest" connectionString="DATA SOURCE=orcl;PERSIST SECURITY INFO=True;USER ID=sa;PASSWORD=sa;Max Pool Size=100" /> </connectionStrings>二、Command和DataReader
Command类可以执行所有类型的SQL语句,虽然它可以执行DDL但是我们一般只用它来执行DML
使用命令前我们可以选择命令类型,设置命令文本并把命令绑定到链接上,可以通过设定相应的属性(CommandType CommandType 和Connection)来
设置这一切。或者把他们作为构造函数的额参数传递
命令可以是一条sql语句、一个存储过程或者某个表的名字,这依赖于你正在使用的命令类型。
Command提供3个常用的方法来执行命令
DataReader 允许你以只进、只读流的方式每次读取一条select语句命令返回的记录。下面是它提供的一些方法
下面一个简单的demo来介绍如何使用DataReader
首先配置链接字符串:
<connectionStrings> <add name="MyTest" connectionString="DATA SOURCE=orcl;PERSIST SECURITY INFO=True;USER ID=sa;PASSWORD=sa" /> </connectionStrings>
我用的oracle,服务器在本机,简单的在web.config配置下connectionStrings
然后后台:
private string strConn = null; private OracleConnection o_Conn = null; private OracleCommand o_Comm = null; private OracleDataReader o_Reader = null; private string sql = null; public DbTest() { strConn = ConfigurationManager.ConnectionStrings["MyTest"].ConnectionString; o_Conn = new OracleConnection(strConn); } public OracleConnection GetConn { get{ return this.o_Conn; } } /// <summary> /// 简单测试 /// </summary> /// <returns></returns> public OracleDataReader GetReader() { try { sql = "select * from dept"; o_Comm = new OracleCommand(sql, o_Conn);//这里也可以分开写 o_Comm.CommandType = CommandType.Text;//这个是默认可以不用设置 o_Conn.Open(); o_Reader = o_Comm.ExecuteReader(); } catch (Exception ex) { o_Reader = null; } return o_Reader; }然后就是在页面上调用显示,处理DataReader的地方一定要加上try..catch
if (!IsPostBack) { DbTest o_Dt=null; try { o_Dt= new DbTest(); StringBuilder sb = new StringBuilder("<br>"); OracleDataReader _reader = o_Dt.GetReader(); while (_reader.Read()) { sb.Append("部门编号:" + _reader["DEPTNO"] + ",部门名称:" + _reader["DNAME"] + "<br>"); } Response.Write(sb.ToString()); } catch (Exception ex) { Response.Write(ex.Message); } finally { o_Dt.GetConn.Close(); } }
最后得到结果
我们还可以将DataReader直接绑定到GridView上
grd1.DataSource = _reader; grd1.DataBind();结果如图
当然DataReader 不止能返回一个结果集,它有可能执行存储过程或者是用分号隔开的多个查询语句,这时但会多个结果集可以用NextReader()方法加上Read()方法遍历所有
结果集。
相关文章推荐
- Winform开发之ADO.NET对象Connection、Command、DataReader、DataAdapter、DataSet和DataTable简介
- ADO.NET技术简介(一) Connection、Command、DataReader、DataAdapter、DataSet和DataTable
- 清清楚楚asp.net ( 九 ) : ADO.NET之Command/DataReader
- ADO.NET——Command(执行SQL) & DataReader(读取数据库)
- ADO.NET 基础(Connection、Command、DataReader)
- 浅谈ADO.NET中的对象——Connection、Command、DataReader、DataAdapter、DataSet、DataTable
- ADO.NET——Command(执行SQL) & DataReader(读取数据库)
- ADO.NET最佳实践--Connection,Command,DataReader,DataSet,DataAdapter,Dataview
- 什么是sqlcommand,或者什么是ado。net的command
- ado.net 连接池相关知识
- 如何更好的进行ADO.NET连接池连接
- ADO.NET_第七篇_OracleCommand_02ExecuteReader
- ADO.NET之8-数据读取器,DataReader---ShinePans
- ADO.NET——Connection、Command。
- ADO.NET连接池FAQ
- ADO.NET 连接池理解
- 什么是连接池:Ado.net连接池使用总结:什么情况下需要禁用连接池?
- ADO.NET_第二篇_OracleConnection/OracleCommand
- ADO.NET DataReader和DataAdapter的区别
- ADO.NET连接池FAQ