[已解决问题] 2种取数据方式,那种更好?
提问时间: 2008-06-05 07:53
悬赏分:100 浏览:410 次

各位老大,小弟原来用面向过程的方法编程,具体方法

方法1.

private void GetItem(string id)

{

DataSet ds = DataAccess. GetDataSet("sql语句");

this.datagrid1.dataSource = ds;

this.datagrid1.dataBind();

}

现在想换成如下:方法2

 public IList<Account> GetAccounts() {

            IList<Account> account = new List<Account>();

            using (SqlDataReader reader = SQLHelper.ExecuteReader(SQLHelper.ConnectionString, CommandType.Text, SQL_SELECT_ACCOUNTS, null)) {
                while (reader.Read()) {
                    Account myAcount = new Account(reader.GetString(0), reader.GetString(1), reader.GetString(2), reader.GetString(3), reader.GetString(4), null, null, null, reader.GetString(8), reader.GetString(9));
                    account.Add(myAcount);
                }
            }
            return account;
        }

this.datagrid.datasource = GetAccounts();

this.datagrid.dataBind();

现在我想问的是:第2种方法中的红色部分会对read中的每行数据产生一个新的对象实体,最终返回对象集合,这样下来,效率上会不会有很大的降低?

另外,从程序运行效率方面考虑,运用那种方法比较好,谢谢!

提问者:冀中 - 初学一级
最佳答案
效率不会低,反而会高一些;dataReader是快速只读游标;比dataAdapter Fille dataset的效率要高. 从程序运行效率考虑当然是选第二种,从开发效率要选第一种。 另外如果需要批量处理的时候,比如说批量插入更新,这时候dataset会有优势。单从取数据的角度,dataset要略逊一筹。 google一下会有很多结果,你可以看一下。 http://www.google.cn/search?hl=zh-CN&q=dataset+datareader&meta=&aq=f 如果你有时间,也可以用reflector反编译一下System.Data.dll,看看DataAdapter是如何填充dataset;这样可以更好的理解。
2008/6/5 8:56:04 回答者:玉开


提问者对于答案的评价:哦,感谢!我有空好好看看系统中的System.Data是如何填充数据的。
其它回答(8)
关注!!
4个月前   回答者:雅阁布 - 菜鸟二级
个人感觉效率上实际差别应该不大。 如果一定要选择一个,相对而言选择第2种方法。 DataSet是重量级的,ExecuteReader是只读的。
4个月前   回答者:datasky - 小虾三级
第二种效率比第一种要高,DataSet本身构造太复杂,效率低下。
4个月前   回答者:李.net - 小虾三级
现在用第二种的比较多~~
4个月前   回答者:沙加 - 老鸟四级
第二种效率高,但与第一种相比差距不大
4个月前   回答者:瑞克梅塔 - 菜鸟二级
SqlDataReader 这个对象的效率是最高的 但是不方便控制输出的内容,比如我要取第N行第M列的数据,SqlDataReader 这个对象就不好处理. DataSet 是重量级的对象,效率最低,但是可以同时查询出多个表的内容,如在一个存储过程里有多条 select * from [表名] 都可以放到这个对象里,用的时候用到哪个表的内容就取哪个表的数据,方便! 但是我建议你使用 DataTable 这个对象取值,它效率比DataSet高,比SqlDataReader 方便控制
4个月前   回答者:yeyang - 菜鸟二级
看你如何选择,DataReader是只读的,速度快,DataSet则操作比较多,注意最后关闭数据库
4个月前   回答者:Clingingboy - 菜鸟二级
建议使用第二种方式,另外可以,通过反射把Account属性和DataReader的字段自动关联起来,Cache一下Account PropertyInfo,这样可以少些一些代码
4个月前   回答者:Leox - 初学一级
评论
4个月前   Edward.Net :
每种方法都有它适用的环境,如果仅从性能上考虑的话还是第二种比较高。实际上DataSet也是通过遍历DataReader构建的数据结构,而且结构非常复杂,每次看Reflector的时候都看得眼睛发花。
4个月前   .Net Zoo :
关键是看你的需要了,如果你只是为了显示数据的话,用DataReader,如果你想在GridView中有很多数据操作的话,用DataSet
   您需要登录以后才能回答!
 

我要提问

我的问题


快到期问题

> 问题排行榜

相关内容

相关链接