adoTable打开的速度,讨论。(100分)

  • 主题发起人 主题发起人 lich007
  • 开始时间 开始时间
L

lich007

Unregistered / Unconfirmed
GUEST, unregistred user!
我后台数据库用SQL2000,ADODB连接数据库,程序启动时打开一个约2万条左右的表,
字段约80个,机子配置: PIII 750/256M内存 Adotable.open用秒表计数约25秒,
换用AdoQuery1.open('select * from 表'),也是24秒左右,为了不让用户等得烦,
Form加了进度条。 我想问请教高手这种C/S结构下,这是否正常,有没有优化的方法?

附注: AdoTable的CacheSize改为1000,100,50,但变化没有多大,但看李维的书说这样改
效率很高的? 另外如果用AdoQuery1.open('select top 20 * from 表')则打开很快,
但客户端只显示20条记录,如何让程序在用户移动记录指针时,继续显示下面的记录?
 
一般这种情况肯定是你要用SQL语句,有条件的查询,也就是说,一定要让用户输入条件,
然后才能查询。。。所以你不能用TABLE这种形式的控件。。。
 
这个样子,所有的记录都要取到客户端 ,肯定很慢的
分段显示要你自己控制,比较麻烦,并且sqlserver好象不能从第n条记录开始取出一定数量的记录
也比较麻烦
反正最好不要取所有的记录
 
那问问高手,我要用户输入记录一般都是用:
AdoTable1或AdoQuery1->DataSource->数据可视控件,这种形式,不Open不行啊。

如果用非数据可视控件,然后插入,修改,删除用自己写代码,工作量很大啊,
特别纠错代码很难写。

想问问各位让用户输入界面你们用什么方法?
 
虽然我的表还没有那么多条记录,但我很想知道这道题的答案,楼上的兄弟如果知道答案,
别忘了通知我xjzdy@21cn.com或QQ1844222
 
我一般不使用数据库控件(如dbedit等)进行数据显示,而使用普通控件,这样可能会好一
些。
另,不知你的每条记录的数据量有多大,你的网络情况如何?如果你是通过网络连到SQL Server
的,而你的网络速度又不快(如10M共享网),你就应该考虑一下网络的通信速度对你的程序
的影响了,说不定对网络改造一下,比改程序有效得多。
 
还是要看李维的书
 
我有一个好办法不知道能不能行的通,请你给我50分。
我觉得一般大的数据库纪录有rowid. 如果实在没有,就写一个过程产生一个临时表,增加一个
rowid字段
。20000多条,对于数据库本身来说很快,如果想快,也可以加一个索引。
这样你就可以控制到客户端的数目了 select * from table wherr rowid>=0 and rowid<=xxx
如果想get more. 就 select * from table wherr rowid>xxxx and rowid<=yyyy

 
easemind兄的方法对DBGird显示编辑的我觉得是个好办法,因为知道DBGird一屏大概
有多少条记录,但如果是DBEdit等控件恐怕很难实现定位,另外用Locate等方法定位
记录也难现实。 如何是好?
 
>>AdoTable1或AdoQuery1->DataSource->数据可视控件,这种形式,不Open不行啊。
你用AdoQuery1在查询条件中有and 1=2这句,这样DATASET可以OPEN,但一条记录也不会
选择出来。速度当然快了。。。

还有,如果作的是三层的,用Locate,FIELTER等方法时,条件中有汉字会有问题。
 
这个问题已经有些进展,在DoubleWood提示下,就是把那个表的光标Cursor类型设置
为Server服务器类型,原来是客户端类型的,几乎很快就进入了主界面。

但我看李维的书,并不提倡这样做,说是服务器端和客户端交换频繁,造成网络繁忙,
而客户端Clint虽然第一次取数速度慢,但以后的操作都在客户内存进行,非常快,
这个还没办法测试。 但用户一开始就等几十秒钟,肯定有意见的。我估计只对一两
个数据量大的表进行这样设置还是可以的,其他的代码或者不常用的表还是用默认的
客户端类型。

不知高手还有什么压箱的绝招?
 
你可以用这个属性TClientDataSet.PacketRecords。
 
to lich007,你的办法是解决这个问题的很好办法了,另外给cachsize,设置成1000以内。效率会很高的,
另外,SQL SERVER对于两三万条记录的处理小意思了。
另外给你一个办法,就是用TClientDataset,你可以导航一个ID(唯一标识,最好是无关关键字)
每次调入TClientDataSet,一条记录这样做起来速度快。
 
用TClientDataSet? 还没试用过,各位高手能不能讲清楚些?

另外我把光标类型改为Server类型以后,用AdoConnection的事务处理出现了问题,
就是分别简单的在一个表的BeforePost加AdoConnection.BeginTrans,AfterPost加
AdoConnection.CommitTrans,在OnPosterrer加AdoConnection.RollbackTrans,但表存盘
以后移动记录时却提示事务没有退出,用Clintent光标类型却没有这个现象,不知各位
碰到过没有?
 
后退
顶部