我用的ADO+ACCESS,因为可能有多个客户端运行程序,因为每一秒钟都需要对某张表里的一个时间字段与系统时间进行比较,但每一秒都执行一次AD0Query的SELECT语句担心会影响程序效能,所以希望在一个线程中实时的对数据库进行检测,看是否数据有了更新,然后发送消息让主线程重新执行一次SELECT,不知道要如何实现,谢谢!

解决方案 »

  1.   

    这样我也想到过,但因为每个客户端都可以对数据库进行更改,这样需要客户端之间传递消息,将会新产生很多新的问题,如果完全依靠消息类决定是否对数据库再次进行查询的话,我担心会不可靠。有没有更直接点的方法,比如dataset等控件里有没有什么属性或事件来判断数据已经被改变?
      

  2.   

    ------------------------------
    1.
    type
      shiyan = class(TThread)
      private
        procedure SetName;
      protected
        procedure Execute; override;
      end;
    2.DoTerminate:        产生一个OnTerminate事件;Resume():线程唤醒;
    Supend():线程挂起;
    Synchronize  由主VCL线程调用的一个同步过程
    WaitFor  等待过程的中止并返回Retrun Value属性的数值
      

  3.   

    TClientDataSet组件有个属性:
    ChangeCount:记录修改记录的数据.
      

  4.   

    在我的程序里只用到了ADOConnection和AD0Query怎么办?
      

  5.   

    楼主说的“每个客户端”指的是什么?
    究竟是同一台机器上的不同程序?还是不同机器上面的程序呢?如果是前者,要做到进程间通信,可以用PostMessage/SendMessage机制或者进程间的pipe(管道)进行通信。
    如果是后者,则一般只能通过网络例如TCP/IP来通信。但如果是这样,你用Access来作这个数据库是否合理呢?Access很难支持并发的SQL的。除非你能象用友公司当年那样开发一个类似WebService的接口来访问Access
      

  6.   

    回楼上,我的意思是可能有几台机器同时运行这个程序,都可以对数据进行修改、添加。按你的意思就一定需要进行TCP/IP通信了。我本来是想找一个直接判断数据库是否被修改的方法。我也不一定非要用ACCESS,换其他的数据库都是可以的。只是ACCESS在写代码的时候方便就一直用着了。好像SQL SERVER可以进行类似的判断?
      

  7.   

    Access本来就不是用来面对多用户的并发的,它只是个桌面级的数据库。楼主要小材大用了! ^_^话说回来,就算你的SQL Server也不可能有你想要的功能,Oracle也没有。
      

  8.   

    现在所有常见的数据库本来设计就不会“自动”通知客户端的。都是被动地进行的。
    如果楼主一定要这样做,那么可以试试像我前面那样加一个Serivic层。(但要写很多东西的)
    要不你就老老实实的用Timer来Query一下吧!
    其实,你的需求真的要分分秒秒去刷新吗?还是当用户需要时才去刷新一下就行呢?分析精楚再做可能另有出路呢
      

  9.   

    ADOQUERY.ModiFiy
    好像是这样拼的。你看一下现在手里没有D7
      

  10.   

    试试看用触发器吧,用sql-server
      

  11.   

    不好意思,这么多朋友回了帖自己却没来。谢谢你们。 目前我还是用Timer来Query一下的^^,我把原来的表分成了两个表,因为要查询的记录在原来的表里是少数的,现在要定时查询的表里只顺数条记录了,频繁查询也不是很占资源。各位的意见我慢慢消化一下。
      

  12.   

    回loon1981(懒家伙):
    我用的是BCB6,刚查了一下,你说的好像有用,我得试试Indicates whether the active record is modified.__property bool Modified = {read=FModified, nodefault};DescriptionCheck Modified to determine if the active record is modified. If Modified is true, the active record is modified. If false, the active record is not modified.Note: In general, an application need not check the status of Modified. Properties, events, and methods of TDataSet and its descendants that modify records generally check this status automatically and take appropriate actions based on its value.