熟悉DBF操作的高手请进!!!
请问:如何实现快速对DBF所有记录的同一个字段更新?(更新后的值不一定相同)我用的是移位写的方式,感觉效率不高。有什么好的方法吗?另:FOXPRO的REPLACE命令是如何实现的?
谢谢!!!
问题点数:100、回复次数:13Top
1 楼Bind(宁静雪:找到你,绑定你!)(再战江湖)回复于 2002-08-12 10:08:44 得分 0
upTop
2 楼Bind(宁静雪:找到你,绑定你!)(再战江湖)回复于 2002-08-12 11:28:05 得分 0
没有人知道??Top
3 楼poplarc(毛小虎)回复于 2002-08-12 11:40:51 得分 0
我是低手,也不清楚你的第二个问题是啥子意思。^_^
是不是repl field with mem_var?Top
4 楼Bind(宁静雪:找到你,绑定你!)(再战江湖)回复于 2002-08-12 11:40:59 得分 0
来人啊!!!!Top
5 楼Bind(宁静雪:找到你,绑定你!)(再战江湖)回复于 2002-08-12 11:44:33 得分 0
就是如何用C来实现FOX的REPLACE功能。说白了就是一个文件操作的问题。要修改的内容之间不连续,(间隔固定长度)如何高效率的修改?FOX的效率很高。Top
6 楼poplarc(毛小虎)回复于 2002-08-12 11:45:13 得分 0
对不起,吓着你了?我都说了我是低手嘛!Top
7 楼freelybird(阿愚)回复于 2002-08-12 13:57:41 得分 0
“移位写“是理论上的最快速度。
不明白你为什么说“感觉效率不高“。
我猜可能是操作文件不妥引起的。CFile::Seek(...) CFile::Write(...)Top
8 楼sunmandun(阿满)回复于 2002-08-12 14:04:51 得分 0
为何不用SQL命令去实现你的功能?如UPDATE TABLE SET field as ......Top
9 楼Bind(宁静雪:找到你,绑定你!)(再战江湖)回复于 2002-08-12 14:08:51 得分 0
freelybird(阿愚) :
我的做法如下:
for(INT i = 0; i < nCount; i++){
pos = ....
file.Seek(pos, CFile::begin);
file.Write(...);
}
1千6百多条记录要用近2分钟!!!而FOX的RELPACE命令,如:
REPLACE ALL field WITH XXX
这条命令执行连1秒钟都不要!!!
请指教!!Top
10 楼jz1204(皮特)回复于 2002-08-12 14:17:26 得分 0
人家foxpro有索引,还有优化的算法,速度当然快了!Top
11 楼freelybird(阿愚)回复于 2002-08-12 14:54:13 得分 100
文件太大时,你这样我想肯定比较耗时。
file.Seek(pos, CFile::begin);你为什么每次都从CFile::begin开始编移呢?
用它试试CFile::current(按顺序从当前位置编移)
另外一点,如果把整个文件读入缓冲区,再在内存中一次更新数据,最后一次
写入磁盘,我想会更快的。因为磁盘IO操作是很快的。而且DBF文件也不会太
大(10Mbyte),以空间换时间呗Top
12 楼Bind(宁静雪:找到你,绑定你!)(再战江湖)回复于 2002-08-12 17:46:12 得分 0
freelybird(阿愚) :
你说的第一种方法我早试过了,没什么区别。再说两种SEEK的方法我想操作系统的实现是相同的。
第二种方法我相信会更快一点,不过我不想重写其它字段。而且我认为FOX也不会是用这种做法。
谢谢!!Top
13 楼Bind(宁静雪:找到你,绑定你!)(再战江湖)回复于 2002-08-21 18:15:08 得分 0
无可奈何,只好用freelybird(阿愚) 的办法。Top




