首页 新闻 会员 周边

2种取数据方式,那种更好?

0
悬赏园豆:100 [已解决问题] 解决于 2008-06-06 08:22
<P>各位老大,小弟原来用面向过程的方法编程,具体方法</P> <P>方法1.</P> <P>private void GetItem(string id)</P> <P>{</P> <P>DataSet ds = DataAccess.&nbsp;GetDataSet("sql语句");</P> <P>this.datagrid1.dataSource = ds;</P> <P>this.datagrid1.dataBind();</P> <P>}</P> <P>现在想换成如下:方法2</P> <P>&nbsp;public IList&lt;Account&gt; GetAccounts() {</P> <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IList&lt;Account&gt; account = new List&lt;Account&gt;();</P> <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using (SqlDataReader reader = SQLHelper.ExecuteReader(SQLHelper.ConnectionString, CommandType.Text, SQL_SELECT_ACCOUNTS, null)) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>&nbsp; while (reader.Read()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; account.Add(myAcount);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR></FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return account;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P> <P>this.datagrid.datasource = GetAccounts();</P> <P>this.datagrid.dataBind();</P> <P>现在我想问的是:第2种方法中的红色部分会对read中的每行数据产生一个新的对象实体,最终返回对象集合,这样下来,效率上会不会有很大的降低?</P> <P>另外,从程序运行效率方面考虑,运用那种方法比较好,谢谢!</P>
Shapley的主页 Shapley | 初学一级 | 园豆:55
提问于:2008-06-05 07:53
< >
分享
最佳答案
0
效率不会低,反而会高一些;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;这样可以更好的理解。
玉开 | 大侠五级 |园豆:8822 | 2008-06-05 08:56
其他回答(8)
0
关注!!
GuoyingXiao | 园豆:410 (菜鸟二级) | 2008-06-05 08:32
0
个人感觉效率上实际差别应该不大。 如果一定要选择一个,相对而言选择第2种方法。 DataSet是重量级的,ExecuteReader是只读的。
致博腾远 | 园豆:1389 (小虾三级) | 2008-06-05 08:55
0
第二种效率比第一种要高,DataSet本身构造太复杂,效率低下。
李.net | 园豆:730 (小虾三级) | 2008-06-05 09:01
0
现在用第二种的比较多~~
沙加 | 园豆:3680 (老鸟四级) | 2008-06-05 10:01
0
第二种效率高,但与第一种相比差距不大
DreamTrue | 园豆:215 (菜鸟二级) | 2008-06-05 10:38
0
SqlDataReader 这个对象的效率是最高的 但是不方便控制输出的内容,比如我要取第N行第M列的数据,SqlDataReader 这个对象就不好处理. DataSet 是重量级的对象,效率最低,但是可以同时查询出多个表的内容,如在一个存储过程里有多条 select * from [表名] 都可以放到这个对象里,用的时候用到哪个表的内容就取哪个表的数据,方便! 但是我建议你使用 DataTable 这个对象取值,它效率比DataSet高,比SqlDataReader 方便控制
yeyang | 园豆:418 (菜鸟二级) | 2008-06-05 13:07
0
看你如何选择,DataReader是只读的,速度快,DataSet则操作比较多,注意最后关闭数据库
Clingingboy | 园豆:215 (菜鸟二级) | 2008-06-05 15:09
0
建议使用第二种方式,另外可以,通过反射把Account属性和DataReader的字段自动关联起来,Cache一下Account PropertyInfo,这样可以少些一些代码
Leox | 园豆:461 (菜鸟二级) | 2008-06-05 17:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册