WINFORM中加载大量数据(不分页)有没有好的解决方法?

kkun_3yue3 2009-12-24 01:13:53
WINFORM中加载大量数据(不分页)有没有好的解决方法?
...全文
598 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
大狼尾巴 2010-04-20
  • 打赏
  • 举报
回复
觉得还是应该在滚动条等地方下功夫,好像 MS的 SQL Management Studio里面就是这么做的。。
kkun_3yue3 2010-01-04
  • 打赏
  • 举报
回复
参考15楼的代码
ATGO 2009-12-27
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 kkun_3yue3 的回复:]
引用 18 楼 atgo 的回复:
10万条测试结果
构造100000条数据总用时105.99毫秒
序列化100000条数据总用时26.38毫秒
反序列化100000条数据总用时63.78毫秒
绑定100000条数据总用时4.51毫秒
---------------------------------------------------

毫秒?敢问LZ从数据库到显示要花几秒?


是的,改成序列化后就不是了,成毫秒了
[/Quote]


能不能发DEMO来看看,10万数据从加载到显示不到1秒我还是第一次看到。好像连SQL Server都做不到。
强烈要求
kkun_3yue3 2009-12-27
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 atgo 的回复:]
10万条测试结果
构造100000条数据总用时105.99毫秒
序列化100000条数据总用时26.38毫秒
反序列化100000条数据总用时63.78毫秒
绑定100000条数据总用时4.51毫秒
---------------------------------------------------

毫秒?敢问LZ从数据库到显示要花几秒?
[/Quote]

是的,改成序列化后就不是了,成毫秒了
ATGO 2009-12-25
  • 打赏
  • 举报
回复

10万条测试结果
构造100000条数据总用时105.99毫秒
序列化100000条数据总用时26.38毫秒
反序列化100000条数据总用时63.78毫秒
绑定100000条数据总用时4.51毫秒
---------------------------------------------------

毫秒?敢问LZ从数据库到显示要花几秒?
vssvss 2009-12-24
  • 打赏
  • 举报
回复
一次性读取这么多是有问题的 分页可以
kkun_3yue3 2009-12-24
  • 打赏
  • 举报
回复
1千条数据测试结果
构造1000条数据总用时0.76毫秒
序列化1000条数据总用时4.86毫秒
反序列化1000条数据总用时1.84毫秒
绑定1000条数据总用时108.89毫秒

1万条数据测试结果
构造10000条数据总用时7.75毫秒
序列化10000条数据总用时6.38毫秒
反序列化10000条数据总用时5.31毫秒
绑定10000条数据总用时6.41毫秒

10万条测试结果
构造100000条数据总用时105.99毫秒
序列化100000条数据总用时26.38毫秒
反序列化100000条数据总用时63.78毫秒
绑定100000条数据总用时4.51毫秒

100万条测试结果
构造1000000条数据总用时655.25毫秒
序列化1000000条数据总用时216.65毫秒
反序列化1000000条数据总用时710.97毫秒
绑定1000000条数据总用时6.99毫秒

500万条测试结果
构造5000000条数据总用时3505.64毫秒
序列化5000000条数据总用时1114.01毫秒
反序列化5000000条数据总用时5070.87毫秒
绑定5000000条数据总用时2.74毫秒

1000万条测试结果
内存溢出~
kkun_3yue3 2009-12-24
  • 打赏
  • 举报
回复
自己解决了
用二进制序列化即可,以下是测试代码和测试结果
相关的实体及实体集合类定义

#region MessageEntity
[Serializable]
public partial class MessageCollection : CollectionBase {
public void Add( MessageEntity item ) {
base.List.Add( item );
}

public void Remove( MessageEntity item ) {
base.List.Remove( item );
}

public MessageEntity this[ int index ] {
get { return List[ index ] as MessageEntity; }
set { List[ index ] = value; }
}
}

[Serializable]
public partial class MessageEntity {

#region definition
public static readonly MessageEntity Empty = new MessageEntity();
public event PropertyChangedEventHandler PropertyChanged;
#endregion

#region default construnction
/// <summary>
/// Message
/// </summary>
public MessageEntity() { }
public MessageEntity( String ID, String AccountID, String To, String From, String Cc, String Bcc, String Subject, String HtmlBody, String MessageID, Int32 Size, DateTime CreateDate, Int32 Type, Int32 Priority, Int32 Extend )
: this() {
_ID = ID;
_AccountID = AccountID;
_To = To;
_From = From;
_Cc = Cc;
_Bcc = Bcc;
_Subject = Subject;
_HtmlBody = HtmlBody;
_MessageID = MessageID;
_Size = Size;
_CreateDate = CreateDate;
_Type = Type;
_Priority = Priority;
_Extend = Extend;
}
#endregion

#region Field
private String _ID;
private String _AccountID;
private String _To;
private String _From;
private String _Cc;
private String _Bcc;
private String _Subject;
private String _HtmlBody;
private String _MessageID;
private Int32 _Size;
private DateTime _CreateDate = DateTime.MinValue;
private Int32 _Type;
private Int32 _Priority;
private Int32 _Extend;
#endregion

#region Property
public String ID {
get { return _ID; }
set {
_ID = value;
FirePropertyChanged( "ID" );
}
}

public String AccountID {
get { return _AccountID; }
set {
_AccountID = value;
FirePropertyChanged( "AccountID" );
}
}

public String To {
get { return _To; }
set {
_To = value;
FirePropertyChanged( "To" );
}
}

public String From {
get { return _From; }
set {
_From = value;
FirePropertyChanged( "From" );
}
}

public String Cc {
get { return _Cc; }
set {
_Cc = value;
FirePropertyChanged( "Cc" );
}
}

public String Bcc {
get { return _Bcc; }
set {
_Bcc = value;
FirePropertyChanged( "Bcc" );
}
}

public String Subject {
get { return _Subject; }
set {
_Subject = value;
FirePropertyChanged( "Subject" );
}
}

public String HtmlBody {
get { return _HtmlBody; }
set {
_HtmlBody = value;
FirePropertyChanged( "HtmlBody" );
}
}

public String MessageID {
get { return _MessageID; }
set {
_MessageID = value;
FirePropertyChanged( "MessageID" );
}
}

public Int32 Size {
get { return _Size; }
set {
_Size = value;
FirePropertyChanged( "Size" );
}
}

public DateTime CreateDate {
get { return _CreateDate; }
set {
_CreateDate = value;
FirePropertyChanged( "CreateDate" );
}
}

public Int32 Type {
get { return _Type; }
set {
_Type = value;
FirePropertyChanged( "Type" );
}
}

public Int32 Priority {
get { return _Priority; }
set {
_Priority = value;
FirePropertyChanged( "Priority" );
}
}

public Int32 Extend {
get { return _Extend; }
set {
_Extend = value;
FirePropertyChanged( "Extend" );
}
}

#endregion

#region method
public static bool IsNullOrEmpty( MessageEntity e ) {
return e == null || e == Empty;
}

protected void FirePropertyChanged( string propertyName ) {
if( this.PropertyChanged != null ) {
this.PropertyChanged( this, new PropertyChangedEventArgs( propertyName ) );
}
}
#endregion
}
#endregion


测试代码片断,其中有一个DEV的GridControl对象,绑定上去即可

private void button5_Click( object sender, EventArgs e ) {
if( string.IsNullOrEmpty( textBox2.Text ) ) {
MessageBox.Show( "请输入要测试的对象数量" );
return;
}
int max = int.Parse( textBox2.Text );

StringBuilder sb = new StringBuilder();
for( int i = 0; i < 10240; i++ ) {
sb.Append("ab");
}

MessageCollection collection = new MessageCollection();
Stopwatch s = new Stopwatch();
MessageEntity item = new MessageEntity();
item.AccountID = Guid.NewGuid().ToString();
item.Bcc = "bcc";
item.Cc = "cc";
item.CreateDate = DateTime.Now;
item.Extend = 0;
item.From = "from";
item.ID = Guid.NewGuid().ToString();

item.HtmlBody = sb.ToString();

item.MessageID = Guid.NewGuid().ToString();
item.Priority = 0;
item.Size = 100;
item.Subject = "subject";
item.To = "to";
item.Type = 0;

s.Start();
for( int i = 0; i < max; i++ ) {
item.ID = Guid.NewGuid().ToString();
collection.Add( item );
}
s.Stop();
this.textBox1.Text = string.Format( "构造{2}条数据总用时{0}毫秒{1}", s.Elapsed.TotalMilliseconds.ToString( "0.00" ), Environment.NewLine, max );
s.Reset();


s.Start();
{
IFormatter formatter = new BinaryFormatter();
using( Stream stream = new FileStream( "MyFile.bin", FileMode.Create,
FileAccess.Write, FileShare.None ) ) {
formatter.Serialize( stream, collection );
stream.Close();
}
}
s.Stop();
this.textBox1.Text += string.Format( "序列化{2}条数据总用时{0}毫秒{1}", s.Elapsed.TotalMilliseconds.ToString( "0.00" ), Environment.NewLine, max );
s.Reset();


MessageCollection myObj = null;
s.Start();
{
IFormatter formatter = new BinaryFormatter();
using( Stream stream = new FileStream( "MyFile.bin", FileMode.Open,
FileAccess.Read, FileShare.Read ) ) {
MessageCollection obj = myObj = (MessageCollection)formatter.Deserialize( stream );
stream.Close();
//gridControl1.DataSource = obj;
//gridControl1.DataMember = "MessageEntity";
}
}
s.Stop();
this.textBox1.Text += string.Format( "反序列化{2}条数据总用时{0}毫秒{1}", s.Elapsed.TotalMilliseconds.ToString( "0.00" ), Environment.NewLine, max );
s.Reset();


s.Start();
{
gridControl1.DataSource = myObj;
}
s.Stop();
this.textBox1.Text += string.Format( "绑定{2}条数据总用时{0}毫秒{1}", s.Elapsed.TotalMilliseconds.ToString( "0.00" ), Environment.NewLine, max );
//Process.Start( "explorer.exe", Application.StartupPath );
}
lsj_zrp 2009-12-24
  • 打赏
  • 举报
回复
一次性加载那么多数据,性能方面可能会有问题,再说客户会查看这么多数据么?
很少会有这么变态的要求的
一般只是显示合计的条数,然后显示小部分数据,在根据操作查看其它数据(分页,滚动条添加)
kkun_3yue3 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zzxap 的回复:]
一次取那么多数据出来完全没必要
[/Quote]

举个例子吧,如邮件客户端,某用户是HR或者客服或者售后支持邮箱,
累计收到成千上万封求职简历,投诉或求助邮件,这个场景符合实际吧?
那,FOXMAIL,OUT LOOK,或者LIVE MAIL,WIN MAIL的收件箱是如何加载这些数据呢?
尤其是第二次及以后打开的时候,怎么加载之前的这些邮件呢?
假设他这个量就是10万条数据,每条2K,
ATGO 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zzxap 的回复:]
一次取那么多数据出来完全没必要
[/Quote]

软件设计可以这么说,但客户需求就不一定不这么恶心了。

前段时间我也碰上DataSet报错,也是10W(30列)数据从读数据到DataSet到控件上显示花费20秒左右,但我是用Remoting在客户端中报错的。

或者你能不能把2K字符缩小一半看看.
zzxap 2009-12-24
  • 打赏
  • 举报
回复
一次取那么多数据出来完全没必要
hernmmy 2009-12-24
  • 打赏
  • 举报
回复
怎么我还不是5的倍数呢
hernmmy 2009-12-24
  • 打赏
  • 举报
回复
怎么我还不是5的倍数呢
hernmmy 2009-12-24
  • 打赏
  • 举报
回复
哦...
kkun_3yue3 2009-12-24
  • 打赏
  • 举报
回复
我最担心的是WINFORM里分页不是最好的解决方法,至少不多见~
会不会有更好的方法呢?
zgke 2009-12-24
  • 打赏
  • 举报
回复
如果非要一次全部取出来 放到多个DataSet里. 只不过还的在SQL语句上处理.

另外你可以自己定义个滚动条 根据滚动条和当前能显示的数量来处理.
cykevin 2009-12-24
  • 打赏
  • 举报
回复
用不缓存的方式:SqlDataReader.
angel6709 2009-12-24
  • 打赏
  • 举报
回复
分页吧。
hyblusea 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 kkun_3yue3 的回复:]
10万条数据,每条数据2K个字符,放到DATASET里直接报内存溢出错误~
分页是最后考虑的方法,求其它办法???
[/Quote]

大数据量可以使用 用List<T>来存储,通过反射进行操作,速度比操作DataSet快很多倍
加载更多回复(2)

111,120

社区成员

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

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

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