TTable的CacheUpdate问题(200分)

  • 主题发起人 主题发起人 蓉儿
  • 开始时间 开始时间

蓉儿

Unregistered / Unconfirmed
GUEST, unregistred user!
TTable的CacheUpdate置为true后,新增记录的Index就会乱,
除非ApplyUpdates后Index才会正确。
本人查过delphi的vcl的source,问题出自于BDE,当CacheUpdate=true
时新增记录,该记录未真正写入数据库中,所以不在Index中,
因此BDE按旧Index排序,位置就可能乱。
  
请问版主及各位大虾,可有解决办法? 不胜感激!!!
 
写完一条记录后就调一次ApplyUpdates.
 
既然用了CacheUpdate就是需要对大批数据修改后再做ApplyUpdates
 
众位大虾曾一致建议不要用TTable,而只用TQuery ...
 
TQuery,TTable用什么都一样会有这个问题!!!
如若不用数据库控件,那么什么程序不能自己写?
现在这个问题我已去Inprise公司问过了,没人可以给出答案,只好等
BDE的下一个版本了。
 
>>"当CacheUpdate=true
时新增记录,该记录未真正写入数据库中,所以不在Index中,
因此BDE按旧Index排序,位置就可能乱。 "

在这种情况下,索引当然不会起作用,
应该说是完全正常的一件事情.
我看什么版本的BDE/Delphi/C++Builder
也不会解决这个问题的. :(
 
使用TQuery也是一样的现象
如SQL.Text='select * from SCOTT.EMP order by EMPNO'
RequestLive=True, CatchedUpdate=True
时即使已经ApplyUpdates,显示仍然不会order by EMPNO.
只有:
Query.ApplyUpdates; //或 Database.ApplyDates([Query])更好
DataSource.Enabled := False; //Disable后
Query.Close; //
Query.Open; // 不能用Refresh
DataSource.Enabled := True; // 再Enable以达到良好的视觉效果:没有闪烁
后才会达到所要求效果。局域网或数据量小时没问题
 
没有办法
 
这个问题很复杂,由于TTable和TQuery在Client段上的Cursor是静态的,BDE没有
实现动态Cursor,因此不提供动态排序功能.(我只能简单作个说明)

目前微软的ADO提供Client端的动态排序功能.不过ADO目前只有 MSSQL 和 Oracle
的OLEDB原生驱动,其他后台须通过OLEDB for ODBC连接。

或许BDE的下一版本会提供此功能,但目前BDE越来越庞大,由于发展时间较早,因此很难维护,有消息说Inprise正在重写新的数据库引擎,性能比ADO快30%.




 

我的笨办法就是当用户界面要求排序时,就让 CacheUpdate=false.

但这样每插入、删除一条记录时速度就比较慢。我用的是本机的数据库,不知

连接到服务器上时速度怎样?
 
速度影响不大
 
完全可以实现蓉儿要求的效果(输入带排序带cacheupdate), 效果而已, 方法不同.
不过....(有必要吗?)
方法:
1. 去下载一个第三方的grid控件(很多都带排序功能的), 这类控件基本都是stringgrid.
2. 自己控制该stringgrid的初始数据的读入(有的控件本身就提供读入数据库的功能)
3. 每插入或删除或修改一条记录时动态生成sql语言.
嘿嘿嘿嘿.
 
结束一下, 总的来说, 你如果不能把数据下载到Client, 单纯的
利用TQUERY, 或TTable 是无法应用在CacheUpdate之前排序的.
 
后退
顶部