设想是:
将服务器一些不怎么变化的数据表,导入本地数据,进行运算或者过滤或查询比较快速,而且没有必要一次次的网络查询。每次更改后,可以提示用户更新下载先用了clientdataset.savetofile的方法,但是在clientdataset.file:='test.cds'后,发现执行运算时,从网络流量里监控,仍然访问服务器端。
后来用clientdataset.loadfromfile的方法,发现无法运行例如'select * from table'这样的查询。
后来又想用adoquery在本地创建一个相同的表,但是又发现两个数据库的同步是个问题昨晚搞到今天早晨,头大了。谁help俺一下?

解决方案 »

  1.   

    其实不用导入本地数据库,在软件登录时把一些不怎么变化的数据 加载到客户端内存就好了。
    查询的时候就用filter的 一套东西
      

  2.   

    楼上不要误导. 要实现离线模式. 就要考虑在什么地方离线. 你的动态查询显然是无法支持离线的. 你要在使用数据的时候判断是否离线, 从而决定数据从哪儿取...如: if isOffLine then 
    begin
      cdsCustomer.LoadFromFile("cache\customer.cds");
    end
    else
    begin
      cdsCustomer.commandText := "select * from customer"; 
      cds.Open();  
    end;...其它就一样了. 
      

  3.   

    关于同步...这个是个大问题. 1.同步? 
      * 启动时同步. 软件每次启动时, 将需要cache的数据从服务器上抓过来.保存到cache中. 
        cdsCustomer.commandText := "select * from customer"; 
        cdsCustomer.Open(); 
        cdsCustomer.SaveToFile("cache\customer.cds"); 
        这样比较简单, 但是, 不能及时反映更新. 
      * 定时同步. 软件启动一后台线程(可以在主窗口上放一timer, 10分钟1次, 或是30分钟1次)
      * 实时同步. 基本上, 这个很难. 除非你的架构是cache是统一放在服务器上的. 在需要cache的数据被更新之后就更新服务器上的cache(目前的WEB应用充分使用了这一点, 因为数据库的响应还是慢的, 成本是高的, baidu: memcached). 而且这种同步是无法考虑到后台你手动更新数据库. 没有2了, 想说的都说了. 你要根据你的应用场景来选择同步方式...记住, 如果你选择实时同步, 那基本上还不如不要离线. 因为对网络还是有要求的. 当然, 你也许只希望把数据cache以减少网络访问和数据库的压力(我们经常这么做...一些不常变动的系统参数,系统字典,还有一些主数据---产品图片之类), 定时也就够用了. 同样说一句, 在这方面的优化无止境. 请参考WEB应用的优化. 
      

  4.   

    什麼誤導?兩方面都要入手
    1.數據庫設計好,速度快、效率高;
    2.可以建構成在線與離線模式,當離線時數據在本地,在線時將數據上傳;(每次運行在線時,可下載在線的數據至本地)if isOnLine then //在線
    begin
    ....
    end else  //離線
    begin
    ...
    end
    3.啟動時:本地與網絡同步(也就是啟動時同步)...
      

  5.   

    又折腾了一宿,发现本地查询是可以的。
    综合了各位的观点,确定不需要同步的地方后loadfromfile的cds。
    建了两个clientdataset,一个指向本地文件,一个指向网络。
    修改clientdataset.data:=localcds.data;后,虽然开始无法执行select * from table之类的操作。
    但是后来发现,如果在clientdataset.data:=localcds.data;clientdataset.open;后是可以执行查找的。
    关于同步,登录时,savetofile。然后调用。时时同步,不弄了,只给了一个数据更新后的提示,提示完了后再下载
    挺郁闷的如编辑或者添加某条数据让其同步起来目前仍然没招。结贴了。
    分配不均也没办法昂