一、连接池
虽然请求链接耗时很短,但是确实是需要时间的。一般使用连接池来优化,链接池保持已经打开的数据库链接,这些链接使用相同数据源之间的会话共享。这样就省下了不断
创建和销毁链接的时间了。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>
然后后台:
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()方法遍历所有
结果集。