您的位置:首页 > 其它

ADO.NET(三) 连接池、Command、DataReader

2013-11-23 14:29 387 查看
一、连接池

虽然请求链接耗时很短,但是确实是需要时间的。一般使用连接池来优化,链接池保持已经打开的数据库链接,这些链接使用相同数据源之间的会话共享。这样就省下了不断

创建和销毁链接的时间了。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()方法遍历所有

结果集。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: