〓〓 TClientDataSet史上最痛苦的两个癌症Bug 〓〓(100分)

青云

Unregistered / Unconfirmed
GUEST, unregistred user!
这两个大Bug从delphi7到delphi2007就一直没有解决过,
delphi2009这次有没有解决,我也不知道,没有兴趣再去研究d2009了,
毕竟它的改动太大,支持了Unicode,以前的那么多项目很难移植过去。
不过所有的d7的项目转到d2007还可以,不是太麻烦,
只是有明显的是:d2007的ClientDataSet在记录条数多的情况下明显的慢于D7;
闲话少说:
两大Bug的内容是:
1.中文过滤问题:这个问题我以及在这里谈了很多次,据说d2009仍然没有解决;
症状是:
1.1不能过来单个中文字,比如'%你%',
2.2 如果该字段正好是两个字的中文,不如是‘你们’那么能不能过滤'%你们%'
这个bug,困扰了7,8年,我也早失去了信心;
所以这个问题,我想也不要再讨论了;
关键是第二个问题:
2. 我一般使用oracle数据库,为了使效率最高;
所以一直用DbExpress驱动+TClientDataSet
有的时候,一个查询数据记录太多,所以我就把
TClientDataSet.PacketRecords 从默认的-1修改成一个较小的数,比如 1000;
这样每次一显示,最多1000条,提高了现实效率,也避免窗体一打开就死机的样子;
但是当我拉动DbGrid的时候,拉到最后,发现记录数比总记录数多了1000条;
也就是比如本来一共5000条,第一次显示1000条,拉动DbGrid,最终显示6000条!
你会发现前面1000条的记录在DbGrid里都重复了两次!
太郁闷了,所以我还是只能是设置 TClientDataSet.PacketRecords =-1 ;
这个bug,在D7,D2007也是同样有。
TClientDataSet是我在项目中,最最重要的一个组件。
为了这个PacketRecords 的bug,同样也困扰了我很多年。
真是痛不堪言。
在这里发一下牢sao,缓解下情绪

最后再附加我不敢确认的Bug:
TClientDataSet 好像不能支持多字段的任意排序;
比如有3个字段A,B,C
要么按照 A,B,C正排序,要么反排序;
比如要实现:order by A ,B desc ,C ;
这样任意组合的对字段排序好像不能;
也许是我对它的排序研究的不透,不过我确实研究了多年,没有实现。
 
不明白
c/s模型不能用单个汉字做模糊查询??
我的怎么好的
 
你可能用的不是全模糊查询,比如你用的是'你%' 或'%你';这个问题是公认的大bug;
CodeGear,我想已经没有能力解决了。我也多次问过李维老师,一样没有答案。再说李维老师现在也脱离delphi了,连个权威问的地方都没有。
第一个问题,我认栽了。
现在只想能解决第二个问题。
 
送这个给你
midas.dll/midaslib.dcu补丁
http://u.skygz.com/mypane.aspx?down=ok&filepath=skygz%2f%c6%e4%cb%fc%2fMidaslib.rar
 
运行
sql:='select * from book where auther like '+'''%'+edit2.Text+'%''';
是可以的啊
是这样的吗??
 
楼上的兄弟,你说的是数据库层次的sql功能,和delphi没有关系;
这和ClientDateSet的过滤是两个概念;
比如:ClientDataSet.Filter:='filed1 like %你%'
 
楼主用的正版还是盗版?
 
风铃夜思雨 朋友,
最好好事做到底,把修改的代码也贴出来吧
这样别人好清楚是怎么回事。
 
delphi7的一个update包不是解决了你的问题1了吗
 
那有什么代码改
我是直接对DCU和DLL修改
 
midas.dll就是有这个问题,到了2009也是如此。
 
请教 风铃夜思雨
如何
直接把网页URL传给IhtmlDocument2对象来提取网页源码?
 
第一个问题 pb(powerbuilder)也有
估计来自于数据库驱动层
 
第一个问题来源于midas.dll.并非是驱动层。
网上也早已经有解决方法。
 
关键是D2007下的TClientDataSet的效率问题,远远慢于D7;
不知道什么原因,D7下显示1,2万条记录,大概1,2秒的样子;
但是在D2007下,基本就需要10秒。不能忍受这样的速度
 
呵呵,看到几位哥们的意见,愚兄发表一下个人的看法,仅作参考——
对于TClientDataSet来说,Delphi在创造它时就将它作为一个Client端使用的TDataSet,那么对应的就是Server使用的TDataSet,显然,在Delphi的创意中,这个TClientDataSet是用于从Server向Client传递后使用的一个DataSet,因此,TClientDataSet并不适用于大型数据集合,即使它在D7中速度快,我个人也不建议使用TClientDataSet作为大规模数据的显示处理方案。
其实DBGrid的显示模式在B/S模式下已经过时,可以说完全不可用,真正适用的是类似WEB网页上EMail显示的那种格式。
因此,如果想进行大数据量的操作:
1、应该还是使用C/S结构。当然,我个人更建议采用CCS模式(见笑,我创建的,即Client/Cache/Server)。
2、数据集合不如直接使用TADODataSet,不需要再转用TClientDataSet,具体的数据排序使用SQL处理。
3、对于TClientDataSet的效率问题,我个人的意见是将这个问题转为模块规划问题+使用习惯问题两个问题来解决。
 
有很多内存表的 控件
ado2.6以上也 支持 流传输
你自己 写过3层框架 也很简单
Client 俺 都 3-4年 没用过了
 
我是自已写中间件,要多少传多少
 
我也试过第一个问题,单个中文字不能过滤,两个中文字就可以。好郁闷哦!
 
要控制显示多少记录,为什么不通过传参数的形式在中间层解决,客户端的CDS就不要让它做多少事了。
 

Similar threads

顶部