如我有一个select语句返回查询结果时是直接用DataAdapter的fill方法填入好呢,还是用Command方法的ExecuteReader,然后根据reader的表结构建表,加入数据。
以上两个方法哪个好些呢?我特指的是一些数据量较大的查询?
可以的话请各位说说两个方法的好处

解决方案 »

  1.   

    后者好一些
    1、得到了结构填充,加快了速度。
    2、datareader读数据最快。
      

  2.   

    DataReader是只读的,速度应该比Fill出来的DataSet要快。
      

  3.   

    看你需要显示什么数据了。。如果是想用dataGrid把数据显示出来,当然是fill了。。如果是想一个个的显示。。DataReader也许好一些。。
      

  4.   

    速度最快是是datareader 最方便的是dataset
    批量读取数据最快的代码如下,比直接fill快15%-30%    /// <summary>
        /// GetList:批量获取列表
        /// </summary>
        /// <returns>ArrayList 比dataset更快的方式。</returns>    public System.Collections.ArrayList GetList(){
            string StrSql ="Select 产品ID,产品名称,单价,单位数量,订购量,供应商ID,库存量,类别ID,再订购量,中止 FROM 产品";
           OleDbDataReader dr  = this.CreateOleDbDataReader(StrSql);
           entity_产品  Myentity;
           Myentity=null;
             System.Collections.ArrayList ResultList;
            ResultList = new System.Collections.ArrayList();
            int[] FieldIndexs=new int[10]; 
            bool IndexInited = false;
            while (dr.Read()){
                if (!IndexInited) {
                     FieldIndexs[0] = dr.GetOrdinal("产品ID");
                     FieldIndexs[1] = dr.GetOrdinal("产品名称");
                     FieldIndexs[2] = dr.GetOrdinal("单价");
                     FieldIndexs[3] = dr.GetOrdinal("单位数量");
                     FieldIndexs[4] = dr.GetOrdinal("订购量");
                     FieldIndexs[5] = dr.GetOrdinal("供应商ID");
                     FieldIndexs[6] = dr.GetOrdinal("库存量");
                     FieldIndexs[7] = dr.GetOrdinal("类别ID");
                     FieldIndexs[8] = dr.GetOrdinal("再订购量");
                     FieldIndexs[9] = dr.GetOrdinal("中止");
                     IndexInited = true;
                }
                Myentity = new entity_产品();
                if   (dr.IsDBNull(FieldIndexs[0])) {
                     Myentity.产品ID ="";}//字符类型,默认为 空字符
                else{
                     Myentity.产品ID = dr.GetInt32(FieldIndexs[0]);
                }
                if   (dr.IsDBNull(FieldIndexs[1])) {
                     Myentity.产品名称 =null;}//其他 默认为 null
                else{
                     Myentity.产品名称 = dr.GetString(FieldIndexs[1]);
                }
                if   (dr.IsDBNull(FieldIndexs[2])) {
                     Myentity.单价 =null;}//其他 默认为 null
                else{
                     Myentity.单价 = dr.GetDecimal(FieldIndexs[2]);
                }
                if   (dr.IsDBNull(FieldIndexs[3])) {
                     Myentity.单位数量 =null;}//其他 默认为 null
                else{
                     Myentity.单位数量 = dr.GetString(FieldIndexs[3]);
                }
                if   (dr.IsDBNull(FieldIndexs[4])) {
                     Myentity.订购量 ="";}//字符类型,默认为 空字符
                else{
                     Myentity.订购量 = dr.GetInt16(FieldIndexs[4]);
                }
                if   (dr.IsDBNull(FieldIndexs[5])) {
                     Myentity.供应商ID ="";}//字符类型,默认为 空字符
                else{
                     Myentity.供应商ID = dr.GetInt32(FieldIndexs[5]);
                }
                if   (dr.IsDBNull(FieldIndexs[6])) {
                     Myentity.库存量 ="";}//字符类型,默认为 空字符
                else{
                     Myentity.库存量 = dr.GetInt16(FieldIndexs[6]);
                }
                if   (dr.IsDBNull(FieldIndexs[7])) {
                     Myentity.类别ID ="";}//字符类型,默认为 空字符
                else{
                     Myentity.类别ID = dr.GetInt32(FieldIndexs[7]);
                }
                if   (dr.IsDBNull(FieldIndexs[8])) {
                     Myentity.再订购量 ="";}//字符类型,默认为 空字符
                else{
                     Myentity.再订购量 = dr.GetInt16(FieldIndexs[8]);
                }
                if   (dr.IsDBNull(FieldIndexs[9])) {
                     Myentity.中止 =null;}//其他 默认为 null
                else{
                     Myentity.中止 = dr.GetBoolean(FieldIndexs[9]);
                }
            ResultList.Add(Myentity);
            }
            dr.Close();
            return ResultList;
       }//GetList以上代码直接通过我的代码生成器生成,欢迎使用。。
    地址:http://blog.csdn.net/Qqwwee_Com/archive/2005/11/06/524080.aspx#region 广告开始  CSDN小助手 V2.5,更快、更爽、更方便的浏览CSDN论坛!
      界面:http://blog.csdn.net/Qqwwee_Com/archive/2005/11/05/523395.aspx
      下载:http://szlawbook.com/csdnv2#endregion
      

  5.   

    DataReader是只进、只读的,所以它的优点是读取速度快,应用于通常的无结构信息数据的读取,它是一个轻量级的数据访问,缺点是一个DataReader必须依赖于一个Connection;DataAdapter的优点在于可以fill带有结构描述信息的DataSet,同时不依赖于一个Connection,是重量级的访问。如果你要从Reader中读取数据填充表,显然是fill比较合适,因为在1.1框架中的DataTable是没有索引结构的,插入操作消耗会比较大。
      

  6.   

    datareader是独占方式读,如果需要同时读取数据最好不用。
      

  7.   

    只是读一次数据显示(不再操纵数据)用DataReader,数度快,节约资源
    否则用DataAdapter的fill
      

  8.   

    如果只是读出来用datareader比较快,能不用DataSet就不用,这样程序的性能会好一些。
      

  9.   

    刚才google上查了一下,原来fill方法最终也是用reader填充的,看来只查询的话确实DataReader快一些。