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