如何知道某个纪录的某个字段被更改了?(300分)

  • 主题发起人 主题发起人 cAkk
  • 开始时间 开始时间
C

cAkk

Unregistered / Unconfirmed
GUEST, unregistred user!
事情是这样的:
我现在需要访问一系列别人提供的数据库(dbase),这套dbf数据每格10秒左右
自动更新.格式已经提供给我了, 我需要每格10秒去读取最新的数据,然后通过
winsock发送到另一台机器上,为了减少网络流量,我决定先过滤出最新的纪录,
(如果可能,甚至过滤出最新的字段),这样每次发送只要发送少量的数据就可以
了.

我可以为每次数据保存一个副本,用来检测对比.
那么怎样能检测出当前的dbf里面的数据,相对上次的副本来说被更新了?
怎样算法最快速? 难道一定要一条一条纪录,一个一个字段对比? 有没有
更巧妙的办法?

要求速度快.
 
说句话牙!
 
//不知道行不行
select yourfield from gre
where yourfield not in (select a.yourfield from old a, new b
where a.yourfield=b.yourfield)
 
只能检测一个字段吗? 那套数据库有3-4个,每个格式不一样,字段有好几十个.
 
可以用SQL语句:

select new.*
from new,old
where new.key=old.key
and ((new.a1<>old.a1) or (new.a2<>old.a2) or ....)

条件中第二个条件要列举所有除了KEY以外的所有字段。

这个SQL语句没有考虑新增和删除的变化,若你的数据记录数不变,
不增加,也不删除,则可以了。
否则还要考虑新增和删除的情况,将下面两个语句再执行一下:
1、新增
select *
from new
where key not in (select key from old)

2、删除
select *
from old
where key not in (select key from new)

 
yck: 这样返回的是更新过的整个纪录,能否只返回被更新的字段?

而且,照你的这种做法,一个600-700个纪录,25个字段的dbf库,检查一次需要
多长时间? 大概估计一下,拜托! 能否保证在1-5秒之内?
 
有趣,有趣,假如是sql,或access倒是容易,加一个时间戳,
或者加一个触发器就可以了。但是对于dbase,呵呵,麻烦。
麻烦啊!除非修改别人的程序,否则真是一场噩梦。

假如你的程序和数据库在一台机器上,你倒是还有一个办法,
就是接管对这个文件的读写操作,dbase的记录是定长的嘛
这样基本可以求出他改动了那些记录。甚至是字段。
 
>>接管对这个文件的读写操作,
是在同一台机器上的,能说的详细些吗? 更新数据的程序是别人提供的,DOS下的
程序,从卫星卡上接受数据. 而我的程序负责每10秒检索最新数据,然后把新数据
发送到远程的sql server上.

另: dbase文件的结构我理解,你可以直接切入正题讲.
 
还是用记录更新吧,和复杂的算法比起来,我觉得不会慢.
 
这必须利用dos级别的中断调用,记录写操作。
而且是个tsr.
这个我没有深研究过,我想起一个人,他做过类似的程序。
任良-- 0512-3376953
我没发现他的email,他说欢迎别人和他联系的,你试试看吧。
 
找到他主页和email了
rlsoft@iname.com
http://member.netease.com/~rlsoft/
 
都什么年代了? tsr哪会管用.
 
每个字段都有一个更改的事件的:onChange 你将想做的事放在这个
事件中,不知妥否。
 
你可以每个10秒中将dbase数据库的数据转为SQL数据库,然后对每个
表添加Trigger,但必须保证你的数据能在10秒中内转换完成。
 
在添加记录前(用Trigger)先判断此记录是否存在,若不存在,或被修改,则将此记录写入,并发送。。。
若存在,就不忽略。
 
lop:修改dbf的程序不是我自己的,是别人提供的,所以无法onChange

Energy:这种问题用DOS中断太恐怖了.... :-(

贺喜的方法不太明白,我10秒钟内不仅要筛选出更新的数据,还要发送到远程机器
上面去哪! 你的方法恐怕时间不够.

CJ跑哪儿去了? 不知道他的传家宝ASTA行不行?

 
是不是股票数据?
如果记录数是固定的,在程序里设几个线程每个线程比对100支股票
(高手面前俺小声说说)
 
1.是股票数据;
2.纪录数不是固定的,因为可能随时有新股.
 
其实你的库很小:一个600-700个纪录,25个字段的dbf库
所以根本不需要多考虑算法,直接将新旧两个表排序打开,
一个一个地比较就可以了。
这样的话,还可以实现你说的只找被修改的字段的功能。
 
yck: 我想最后恐怕也只能是这个办法,就是不知道能否保证在10秒内筛选出新数据
并发送到远程机器上.
 
后退
顶部