读select语句时用DataReader一个个的读好呢,还是DataAdapter的fill方法好呢?

mqmmx 2005-11-22 11:44:23
如我有一个select语句返回查询结果时是直接用DataAdapter的fill方法填入好呢,还是用Command方法的ExecuteReader,然后根据reader的表结构建表,加入数据。
以上两个方法哪个好些呢?我特指的是一些数据量较大的查询?
可以的话请各位说说两个方法的好处
...全文
257 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xxuu503 2005-11-22
  • 打赏
  • 举报
回复
fill简单
q_po_o 2005-11-22
  • 打赏
  • 举报
回复
只是读一次数据显示(不再操纵数据)用DataReader,数度快,节约资源
否则用DataAdapter的fill
salsfy 2005-11-22
  • 打赏
  • 举报
回复
datareader是独占方式读,如果需要同时读取数据最好不用。
jujuxys 2005-11-22
  • 打赏
  • 举报
回复
DataReader是只进、只读的,所以它的优点是读取速度快,应用于通常的无结构信息数据的读取,它是一个轻量级的数据访问,缺点是一个DataReader必须依赖于一个Connection;DataAdapter的优点在于可以fill带有结构描述信息的DataSet,同时不依赖于一个Connection,是重量级的访问。如果你要从Reader中读取数据填充表,显然是fill比较合适,因为在1.1框架中的DataTable是没有索引结构的,插入操作消耗会比较大。
Qqwwee_Com 2005-11-22
  • 打赏
  • 举报
回复
速度最快是是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
jijl2001 2005-11-22
  • 打赏
  • 举报
回复
楼上有理
止戈而立 2005-11-22
  • 打赏
  • 举报
回复
看你需要显示什么数据了。。如果是想用dataGrid把数据显示出来,当然是fill了。。

如果是想一个个的显示。。DataReader也许好一些。。
fokker 2005-11-22
  • 打赏
  • 举报
回复
DataReader是只读的,速度应该比Fill出来的DataSet要快。
happyfamily 2005-11-22
  • 打赏
  • 举报
回复
后者好一些
1、得到了结构填充,加快了速度。
2、datareader读数据最快。
lsqkeke 2005-11-22
  • 打赏
  • 举报
回复
DataAdapter的fill方法好
mqmmx 2005-11-22
  • 打赏
  • 举报
回复
刚才google上查了一下,原来fill方法最终也是用reader填充的,看来只查询的话确实DataReader快一些。
Micheal_test 2005-11-22
  • 打赏
  • 举报
回复
如果只是读出来用datareader比较快,能不用DataSet就不用,这样程序的性能会好一些。
flyingZFX 2005-11-22
  • 打赏
  • 举报
回复
学习。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧