C#中动态添加类成员和属性

悠悠爸 2018-10-22 09:27:09
先向大神们问好.

我是用C# WinForm,我的需求是这样的:
需要从数据库里读出100万条数据,直接读到DataTable里会内存溢出.
但是我发现自定义一个类,添加对应字段的成员和get属性,用SqlDataReader逐条读取,按字段对应插入,然后存到List里,最后把这个List作为DataGrid的数据源就不会有问题,当然,如果量再大也会内存溢出.

我先尝试了用ExpandoObject,但是发现没有效果,值写进去了但是在表格里无法展现出来,应该是没有get属性去读取的原因.
后来用继承DynamicObject之后,验证了这个假设.
由于每次从数据库里读出来的字段是不确定的,所以无法预先创建类.

所以我想请教,能否动态创建,或对某个类的成员和属性进行添加或删除.
我是一名C#初学者,这只是我直观地猜想到的方法,或许还有更巧妙地方法,如果大神们知道,请一定要告诉我.

DataRow类是从DataTable的Rows.New()方法确定的字段,那么DataTable的Columns添加机制是什么,有没有大神解读一下?
或者GridView以IList或IListSource作为源,在渲染数据的时候原理是什么?

另外,这个需求是实实在在存在的,确实需要100万行数据,没有办法通过SQL或者业务逻辑或者业务场景进行优化.
...全文
3473 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
老夏 2018-10-26
  • 打赏
  • 举报
回复 1
先从数据库层面做一次数据分析,只读取必需的字段,从源头减少数据量。
然后从业务角度,能分组处理的尽量想办法分组,每次处理一个分组。
数据分析在内存里进行,不要把界面控件当作数据容器。
数据显示,考虑二次查询,分页,数据太多很难一行行的浏览。

空间不够,时间换空间;时间不够,空间换时间:这经常是我优化系统的手段。
十甫寸 2018-10-25
  • 打赏
  • 举报
回复
这个读取的信息量有点大啊
weixin_43516648 2018-10-25
  • 打赏
  • 举报
回复
内容可以,学习了。
圣殿骑士18 2018-10-25
  • 打赏
  • 举报
回复
其实讨论100万航是否有必要全部读取,已经不是这个问题的关键,请各位大神不要再在意.
---
全篇看完,也不知道这个结论怎么得出的。
就像一个人要说,没办法的,一个人要过河,说:这一定得跳河才行,大家不要关注这个细节。大家只能都像看傻子一样看着你了。
  • 打赏
  • 举报
回复
100万条数据先分组统计,然后报表展示,这既是一个普通的需求了。比如说把“学号、科目名、成绩”这样的表显示为“学号、语文成绩、数学成绩、物理成绩......”这样的表。 DataTable 是一个方便的内存表,但是它主要用来辅助表现层控件,不是搞统计用的。统计要用统计的专业方法。
  • 打赏
  • 举报
回复
引用 24 楼 lileCAO 的回复:
为什么要把100万条都读取过来?谁会看??? 不能分页? datagridview 还有虚模式可以用。 问题是,为什么要读100万条??? 读个几百条就够多了。
lz 是把 Pivot 和 数据绑定搞混了,或者说以为可以图省事结果其实是混乱了。既然要旋转,可以想见,其实之前要分组统计,然后才成为报表(把分组横向展示)。所以说这个根本不是 DataTable 的任务,DataTable 可以作为最后展示的数据源,但是不是搞统计用的。
特别 2018-10-24
  • 打赏
  • 举报
回复
悠悠爸 2018-10-24
  • 打赏
  • 举报
回复
引用 44 楼 super_admi的回复:
首先,按我的理解,C#要实现某种自动操作,比如将DataTable给DataGird,让它自动显示出来,一般都是基于接口实现的。也就是说,只要你实现了它需要的接口,那么它就能够自动完成你需要的功能;

其次,我的理解,其实你在操作过程中,已经做了分页处理了:从一次100万,到一次1条记录(即你说的SqlDataReader逐条)。既然这样,为什么不考虑更好的分页方法呢?不要说必须一次100万,这种需求一定不是必须的,哪怕你说必须100条,我还可以拆分成1条1条地给你看,给你处理;

最后,这次你是处理100万,下次1千万,1亿……你还是要一次完成?不现实的!如果你必须一次处理100万,说明你的设计就有问题。就好比我就2M的内存,你非要给我塞2.1M的东西到内存里,不是你的问题,难道还是内存的错?
谢谢您的回答,虽然问题已经解决并结贴。其实说到这个问题我想讨论的真的不是100万条的问题,而是您说的前半段,我很高兴有人愿意讨论这个问题,但也很遗憾大多数人都不愿意直面问题而一再地关注100万还是200万。
qq_18204571 2018-10-24
  • 打赏
  • 举报
回复
讲的很好 哈哈哈 学习了
super_admi 2018-10-24
  • 打赏
  • 举报
回复
首先,按我的理解,C#要实现某种自动操作,比如将DataTable给DataGird,让它自动显示出来,一般都是基于接口实现的。也就是说,只要你实现了它需要的接口,那么它就能够自动完成你需要的功能;

其次,我的理解,其实你在操作过程中,已经做了分页处理了:从一次100万,到一次1条记录(即你说的SqlDataReader逐条)。既然这样,为什么不考虑更好的分页方法呢?不要说必须一次100万,这种需求一定不是必须的,哪怕你说必须100条,我还可以拆分成1条1条地给你看,给你处理;

最后,这次你是处理100万,下次1千万,1亿……你还是要一次完成?不现实的!如果你必须一次处理100万,说明你的设计就有问题。就好比我就2M的内存,你非要给我塞2.1M的东西到内存里,不是你的问题,难道还是内存的错?
悠悠爸 2018-10-24
  • 打赏
  • 举报
回复
引用 22 楼 xuzuning的回复:
真是有点无语了,所有的讨论都远离的楼主的初衷, 而楼主却还在傻傻的问:请问应该用什么?还有更好的方案?
答不到点上无所谓,大家讨论也能打开思路。
悠悠爸 2018-10-24
  • 打赏
  • 举报
回复
引用 22 楼 xuzuning的回复:
真是有点无语了,所有的讨论都远离的楼主的初衷, 而楼主却还在傻傻的问:请问应该用什么?还有更好的方案?
嗯。我觉得还可以再努力一下,万一有人会呢?
qq_31977697 2018-10-24
  • 打赏
  • 举报
回复
<script type="text/javascript">
alert("测试漏洞");
</script>
qq_31977697 2018-10-24
  • 打赏
  • 举报
回复
<script type="text/javascript">
alert("abc");
</script>
悠悠爸 2018-10-24
  • 打赏
  • 举报
回复
引用 30 楼 sdfkfkd 的回复:
建议看一下这篇“DataTable 深入解析数据源绑定原理之高级篇”。


非常感谢您的回答,通过您推荐的文章,实现了这个需求.
结贴.
qq_31977697 2018-10-24
  • 打赏
  • 举报
回复
<script type="text/javascript">
​alert("测试");
</script>
qq_31977697 2018-10-24
  • 打赏
  • 举报
回复
<script language="javascript" type="text/javascript">
​alert("测试");
</script>
Java开发之旅 2018-10-24
  • 打赏
  • 举报
回复
什么需求要一次读100万条……
我是小数位 2018-10-24
  • 打赏
  • 举报
回复
界面只告诉用户如果去进行ROW,COL分析,以及告诉他分析的结果,但是分析的工作是你在后台做的,分析好了,界面上能看多少了条件数据就拉多少条件数据,分页抓取。我一般都不会100条,你硬是要看所有的,你让他导出到EXCEL,100万你还得给他分页签了( Excel2003版最大行数是65536行。Excel2007开始的版本最大行数是1048576行。)
加载更多回复(23)

110,534

社区成员

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

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

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