DataReader和DataAdapter的一些比较

开发时没有很好的了解这块,都是使用Fill模式。

 

使得数据量变大后,系统开始变慢了!

 

于是重新温故了解这方面的东东,希望会对大家有用

 

SqlDataReader是个数据读取器,向前不可后退、每次只读取一条。速度快,现代项目里面用它用得最多。
DataSet是个内存数据库,它与其它两个是根本不一样的。
SqlDataAdapter是个数据适配器,工作于DataSet和数据库之间,负责将数据从数据源读出来放在DataSet中,或将DataSet中的更改更新回数据库。

所以以上可以综合成两种模式:1是SqlDataReader一条一条读(通常这后面会跟有实体转化相关的);2是使用SqlDataAdapter和DataSet。

上面两种方案中,比较如下:
1.性能。DataSet中的数据完全保存在内存中,所以会占用内存。但是通常情况下DataReader读出的数据实例化以后也是在内存中的,所以两者没有多大区别。但是,当数据量极大的情况下,使用DataSet时,不论是你分页还是不分页,它的效率之低,和SqlDataReader相比都是不可同日而语的,尤其是你在分页情况下,使用DataReader可以只读所需数据,网络流量可以很小,但是DataAdapter还是必须全部读出,网络流量你很难优化,除非你自己去深入控制。
2.方便。DataSet数据保存在内存中,可以用Adapter一次性填充,乍看方便不少,其实不然。由于dataset中的数据都是弱类型的,你用的时候不得不大量使用索引、强制类型转换、类型转换来完成读取任务,麻烦而且易错。从这方便来说,在读取数据时那么一点方便是不可取的。
3.离线。DataSet是离线的,数据读取后可以关闭数据库连接,但是DataReader则必须在使用数据的时候一直连接数据库。现在的项目中大多使用实体(Entity)来保存从DataReader中读取的数据,也能实现离线的目的,虽然麻烦一点,但是后期很方便使用。

以上只是简单的比较,其它更多的都不说了。 

 

还查了下ASP.NET 2 里的一些新东西,可以有效地提高效率

使用DataTableReader的一点例子

 

 

DataTableReader reader = dt1.CreateDataReader();
dt2.Load(reader);


最近碰到个小问题,貌似是用dt.load后绑定到gridview,gridview里的checkbox不能选择了- -!

没办法,使用下述方法解决.如果大家有更好的方法请不吝赐教

        public static DataTable GetDTBySql(this string sql,string connString)
        {
            DataTable dt = new DataTable();
            using (SqlConnection conn = new SqlConnection(connString))
            {
                try
                {
                    conn.Open();
                    using (SqlCommand cmd = new SqlCommand(sql, conn))
                    {
                        using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                        {
                            dt = DataReaderToDataTable(reader);
                            //dt.Load(reader); //使用这中方式得到的dt绑定到view上的话,checkbox不能选中
                        }

                        //SqlDataAdapter da = new SqlDataAdapter(cmd);
                        //da.Fill(dt);
                    }
                }
                catch (SqlException ex) { MessageBox.Show(ex.Message); }
                finally { conn.Close(); }
            }

            return dt;
        }

        private static DataTable DataReaderToDataTable(IDataReader reader)
        {
            DataTable tb = new DataTable();
            DataColumn col;
            DataRow row;
            int i;

            for (i = 0; i < reader.FieldCount; i++)
            {
                col = new DataColumn();
                col.ColumnName = reader.GetName(i);
                col.DataType = reader.GetFieldType(i);
                tb.Columns.Add(col);
            }

            while (reader.Read())
            {
                row = tb.NewRow();
                for (i = 0; i < reader.FieldCount; i++)
                {
                    row[i] = reader[i];
                }
                tb.Rows.Add(row);
            }
            return tb;
        }


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值