DataTable与DataReader的区别

lawbc 2008-11-26 02:06:42
我之前项目都是用DataReader的,后来测试就有问题,在流量大的时候就是卡死,数据库死掉了,后来改成DataTable就好的了
我有个疑问:DataTable是用DataAdapter的Fill方法填充的,而Fill方法隐式使用DataReader,这是MSDN说的,既然都用DataReader,怎么性能就不一样,差很大
DataReader实例:我是用sqlhelper获取DataReader对象的,然后用循环读取到实体类里,基本没有什么逻辑操作
DataTable实例:我是用sqlhelper获取DataTable对象的,然后也是用循环读取到实体类,

就这样差别那么大是为什么呢???
...全文
755 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
d568176261 2012-03-10
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 qq196260188 的回复:]
引用 12 楼 lingxiaoli 的回复:
1.数据库____connection(DataAdapter)---(内存数据库)Dataset(包含多个表)---绑定控件
2. ...........(内存数据库)Dataset(包含多个表)---(分离)datatable(可看做Dataset子集)--绑定控件
3...........(内存数据库)Dataset(包含多个表)----……
[/Quote]

我以前也使用reder 后来就改成dataset了
kaishiyouxi 2010-11-09
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分
lsf882412 2010-10-23
  • 打赏
  • 举报
回复
我面试就碰到这个问题,只知道一个有保持数据连接,一个没有。在使用过程中小数据量的话我一般用datareader 而较大数据就用datatable了。
YoYoMooc 2010-10-23
  • 打赏
  • 举报
回复
不知道。。不过帮你顶起来
qq196260188 2008-11-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 lingxiaoli 的回复:]
1.数据库____connection(DataAdapter)---(内存数据库)Dataset(包含多个表)---绑定控件
2. ...........(内存数据库)Dataset(包含多个表)---(分离)datatable(可看做Dataset子集)--绑定控件
3...........(内存数据库)Dataset(包含多个表)------(形成流)DataReader---对流操作
[/Quote]

跟我的理解一样,,,支持
  • 打赏
  • 举报
回复
看看MSDN就知道了呀。DataTable看其名字么意思就是数据表,这是一个内存中的数据表,你Fill之后其实就和数据库没连接了。
而DataReader是一个只读的游标,你每一次的Reader都要和数据库交互,而且在你执行DataReader期间是不能有其他的数据库操作的,比如你在你的Reader的代码过程中执行更新,查询等都是会报错了。

一般情况都是用 DataTable等方式,DataReader只在特殊的场合下使用。
melon23 2008-11-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xiaomatian 的回复:]

而DataReader是一个只读的游标,你每一次的Reader都要和数据库交互,而且在你执行DataReader期间是不能有其他的数据库操作的,比如你在你的Reader的代码过程中执行更新,查询等都是会报错了。

一般情况都是用 DataTable等方式,DataReader只在特殊的场合下使用。
[/Quote]

请教各位,假如有1万个人同一时段访问你的网站查询数据,在不考虑缓存的情况下,那就得用dataset比较好了??
因为你说“执行DataReader期间是不能有其他的数据库操作的,比如你在你的Reader的代码过程中执行更新,查询等都是会报错了。”
yoursWTR 2008-11-27
  • 打赏
  • 举报
回复
但是实际情况是DataReader用的比DataTable多

你所说的卡死,不过是设计上的问题
lawbc 2008-11-26
  • 打赏
  • 举报
回复
代码我都说了,去对象的时候无聊是datareader还是datatable都是用sqlhelper的方法取的
然后就是循环读取到实体类,我都是用分页的,用的存储过程
Hashxu 2008-11-26
  • 打赏
  • 举报
回复
可以参考:http://blog.csdn.net/Hashxu/archive/2008/11/26/3382248.aspx
wgl008 2008-11-26
  • 打赏
  • 举报
回复
DataTable,用fill语句填充完就与数据库断开,占用资源少,与datareader比,各有长处,但比较常用的是datatable
treesky 2008-11-26
  • 打赏
  • 举报
回复
速度效率
xingyafei 2008-11-26
  • 打赏
  • 举报
回复
up
eeeerr 2008-11-26
  • 打赏
  • 举报
回复
这是因为你的数据量大的原因,数据量大datareader链接数据库的时间久长,这样数据库会死掉的。你用datatable是把数据放到内存里了。我建议没有必要一下子去那么多的数据,可以分部分取数据,比如分页。
sunzhong2003 2008-11-26
  • 打赏
  • 举报
回复
估计是写逻辑的时候,太复杂的缘故
DATATABLE也要读取的过程,所以理论上是DATAREADER性能好的
不知道程序如何写,贴出来讨论下
lovehongyun 2008-11-26
  • 打赏
  • 举报
回复
很少量的数据量下
datareader的速度是很快的,但它是一直占用连接.
lovehongyun 2008-11-26
  • 打赏
  • 举报
回复
而Fill方法隐式使用DataReader,这是MSDN说的,既然都用DataReader,怎么性能就不一样,差很大
======================

我下面发的代码是fill()的过程
public int Fill(DataTable dataTable)
{
int num;
IntPtr ptr;
Bid.ScopeEnter(out ptr, "<comm.DbDataAdapter.Fill|API> %d#, dataTable\n", base.ObjectID);
try
{
DataTable[] dataTables = new DataTable[] { dataTable };
IDbCommand selectCommand = this._IDbDataAdapter.SelectCommand;
CommandBehavior fillCommandBehavior = this.FillCommandBehavior;
num = this.Fill(dataTables, 0, 0, selectCommand, fillCommandBehavior);
}
finally
{
Bid.ScopeLeave(ref ptr);
}
return num;
}


protected virtual int Fill(DataTable[] dataTables, int startRecord, int maxRecords, IDbCommand command, CommandBehavior behavior)
{
int num;
IntPtr ptr;
Bid.ScopeEnter(out ptr, "<comm.DbDataAdapter.Fill|API> %d#, dataTables[], startRecord, maxRecords, command, behavior=%d{ds.CommandBehavior}\n", base.ObjectID, (int) behavior);
try
{
if (((dataTables == null) || (dataTables.Length == 0)) || (dataTables[0] == null))
{
throw ADP.FillRequires("dataTable");
}
if (startRecord < 0)
{
throw ADP.InvalidStartRecord("startRecord", startRecord);
}
if (maxRecords < 0)
{
throw ADP.InvalidMaxRecords("maxRecords", maxRecords);
}
if ((1 < dataTables.Length) && ((startRecord != 0) || (maxRecords != 0)))
{
throw ADP.OnlyOneTableForStartRecordOrMaxRecords();
}
if (command == null)
{
throw ADP.MissingSelectCommand("Fill");
}
if (1 == dataTables.Length)
{
behavior |= CommandBehavior.SingleResult;
}
num = this.FillInternal(null, dataTables, startRecord, maxRecords, null, command, behavior);
}
finally
{
Bid.ScopeLeave(ref ptr);
}
return num;
}


private int FillInternal(DataSet dataset, DataTable[] datatables, int startRecord, int maxRecords, string srcTable, IDbCommand command, CommandBehavior behavior)
{
bool flag = null == command.Connection;
try
{
IDbConnection connection = GetConnection3(this, command, "Fill");
ConnectionState open = ConnectionState.Open;
if (MissingSchemaAction.AddWithKey == base.MissingSchemaAction)
{
behavior |= CommandBehavior.KeyInfo;
}
try
{
QuietOpen(connection, out open);
behavior |= CommandBehavior.SequentialAccess;
using (IDataReader reader = null)
{
reader = command.ExecuteReader(behavior);
if (datatables != null)
{
return this.Fill(datatables, reader, startRecord, maxRecords);
}
return this.Fill(dataset, srcTable, reader, startRecord, maxRecords);
}
}
finally
{
QuietClose(connection, open);
}
}
finally
{
if (flag)
{
command.Transaction = null;
command.Connection = null;
}
}
return 0;
}


lovehongyun 2008-11-26
  • 打赏
  • 举报
回复
这两个的区别一个是一直保持连接,一个是可断开式连接(即取完数据后,断开连接)
具体何时应用就要具体问题具体分析了.

对于你说的 "后来测试就有问题,在流量大的时候就是卡死,数据库死掉了,后来改成DataTable就好的了"
要具体分析你用在哪里.程序是如何写的.
lingxiaoli 2008-11-26
  • 打赏
  • 举报
回复
1.数据库____connection(DataAdapter)---(内存数据库)Dataset(包含多个表)---绑定控件
2. ...........(内存数据库)Dataset(包含多个表)---(分离)datatable(可看做Dataset子集)--绑定控件
3...........(内存数据库)Dataset(包含多个表)------(形成流)DataReader---对流操作
chinaxc 2008-11-26
  • 打赏
  • 举报
回复
回帖是一种美德!传说每天回帖即可获得 10 分可用分
加载更多回复(10)
自己写的C#常用类库,使用时请先添加引用:UsrCustomFun.dll、DevComponents.DotNetBar2.dll,压缩包内的其他文件请与UsrCustomFun.dll放置同一目录,然后在程序中引用命名空间:using UsrCustomFun;包括: 1.自定义MessageBox,消息内容与错误代码分开,使用了6个重载方式。调用方法例子: UserMessageBox.UsrShow("执行SQL查询出错!", "数据库错误", ec.Message.ToString()); 2.等待提示窗口,使用了3个重载方法。 打开:UserWaitBox.UsrShow("等待信息"); 关闭:UserWaitBox.UsrClose(); 3.打印DataGridView,使用了9个重载方式,可自定义标题与打印样式: DataGridViewPrint.PrintDgv(dataGridView); 4.DataTable导出为Excel,3个重载方式: DataTableToExcel.DtToExcel(DataTable); 5.DataTable生成Pdf文件,6个重载方式: UsrExport.ExPdf(dataTable); 6.XML文件操作,可根据XML文件节点、路径来读取、修改、写入XML: UserXml.ReadXml(string XML的路径); UserXml.ReadXmlElement(string XML的路径,节点名称); UserXml.WriteXmlElement(XML路径,节点名称,内容); 7.数据库操作,目前有Access、SqlServer、Oracel (7.1)先配置数据库连接字符串: UsrCustomFun.SqlConn.SqlParameters下根据数据库类型返回一个数据库连接字符串。 (7.2)再执行数据库操作: (7.2.1)UsrCustomFun.SqlConn.SqlConnAccess下为Access的数据库操作,可根据SQL返回int型、string型、DataTableDataReader、DataSet及无返回操作。 (7.2.2)UsrCustomFun.SqlConn.SqlConnOracle,操作类型同7.2.1 (7.2.3)UsrCustomFun.SqlConn.SqlConnSqlServer,操作类型同7.2.1

62,269

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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