用Delphi6做了一个Midas的三层数据库程序,大致情况如下:
1、数据库:MS SQL Server2000;
2、应用服务器主要控件: TADOConnection, TADOQuery, TDataSetProvider;
3、客户端主要控件:  TSocketConnection, TClientDataSet, TDataSource;
现在的情况是有三个主从结构的数据表:
服务器端为:ADOQuery_Main, ADOQuery_Detail1, ADOQUery_Detail2三个控件其中服务器上三控件的数据关系为:
                       ADOQuery_Main: select * from Tab_Main
                    ADOQuery_Detail1: select * from Tab_Detail1 where M_id=:ID
                    ADOQuery_Detail2: select * from Tab_Detail2 where M_id=:ID客户端采用TClientDataSet经TSocketConnection控件连接到服务器上的TDataSetProvider控件,且两明细表由主表中的字段:CDS_MainADOQuery_Detail连接,其中也有部份Lookup字段。
起初运行一切正常,但主表中数据为5条,且每条主表数据对应的明细表中的数据达到50条以上后,无论是新增、修改、保存都慢得无法忍受。
大家都是怎么做的?请大家指教。

解决方案 »

  1.   

    不是,这样做的,应传递SQL语句,自己写insert ,up,del 自己写SQL语句来执行。
      

  2.   

    取出所有数据集的DELTA,
    在远程服务器写一个函数procedure TRemoteDm.TranTest(aDataArray: OleVariant; var iResult: OleVariant);
    var
      ts:TTransactionDesc;
      J,I:Integer;
    begin
       iResult:=0;  I:=0;
       ts.TransactionID:=3;
       ts.IsolationLevel:=xilreadcommitted;
       LocalDm.SQLConnection1.StartTransaction(ts);
       for J := VarArrayLowBound(aDataArray, 1) to VarArrayHighBound(aDataArray, 1) do
       begin
         DataSetProvider1.ApplyUpdates(aDataArray[J],0,I);
         if I > 0  then
         begin
           LocalDM.SQLConnection1.Rollback(ts);
           Exit;
         end;
       end;
       LocalDM.SQLConnection1.Commit(ts);
       iResult:=1;
    end;
      
    没测试过,随便想像出来的
      

  3.   

    完全基于数据控件是可以实现的,但写好这个程序难度很大,要写很多事件代码,但比较好用。还有另一种方法,就如1楼所说,在中间层写一些数据库操作函数,客户端来调用,这样比较容易理解和控制,但如考虑多人同时读写一条记录的数据一致性时,还要进行复杂的处理过程。总之,不论用什么方法都建议楼主好好研究一下 李维的《Delphi 5.x 分布式多层应用系统篇》
      

  4.   

    我估计是前端TClientDataSet里数据太多引起的,
    因为保存或移动一条主记录的候特别慢,保存的时候貌似要滚动记录,耗时很多。
      

  5.   

    拜托大家,谁能提供一(xingyunmm所说这种处理方式)简单的例子给我,我另外给200分。
    要求一个主表和主表下关联两个子表:TabMain, TabDetail1, TabDetail2;用Delphi6或Delphi7开发;
    先谢谢了!
      

  6.   

    有的请在这里登记,方便给分,并发到我的QQ邮箱[email protected],谢谢!
      

  7.   

    不知道楼主在应用服务器端是不是做成了主从表的方式,在客户端需要自己写INSERT UPDATE DELETE 的.
      

  8.   

    To lizheng9564:
       服务器端用ADOQuery,DataSource做成主从表方式(ADOQuery_Detail.DataSource=DataSource_Main)还是别的方法?
    只需要一个最简单的DEMO,就三个表:一主表两从表,新增、删除、修改操作
      

  9.   

    一般情况之下,50条这样的数据量,是不会让系统变慢的。因为没有你的源码,只是想针对你显而易见的设计弊端说说:1、绝对杜绝select * from Tab_Main 的语句出现,你完全可以通过关键字段搜索,然后返回需要修改的纪录到客户端,减少传递的数据包。等客户端处理之后,再update到后台。如:Select a.name,a.age from tab_name where id='0001';2、看看自己是否使用了Server端的Cursor,修改成Client Cursor;3、在你的几个表里面,添加关键字段索引。
    (数据库开发,不要过于关注界面,更应该关注性能,对于SQL需要字斟句酌。我相信你添加ID索引后,你的性能立马就可以提升。)
      

  10.   

    二楼说的思路是对的. 在应用服务器上只有一个adoquery, dataprodiver就全搞定了
      

  11.   

    To: jjwwang
      麻烦能否给我一个简单的例子程序? [email protected]
      

  12.   

    你的服务端是否注册为Com组件了,楼也有说,是不是你数据库优化做的不好!楼上都有提到,你是否查查你的问题?
      

  13.   

    这个技术应算是Midas的核心技术,系统的研究一个Midas
    相信你会有很大收获。