看过李维的基本书,从中有所收益,但对实际问题似乎又无从下手,要做一小型系统,想
使用三层结构:
1.数据的处理在哪层实现,是中间逻辑层,服务端还是客户端?
A.查询
B.添加,修改,删除
备注:在进行多表更新时的用法,我不准备用关联表的方法来更新,对于业务上繁琐的要求用SQL可能比较灵活些.
2.数据在更新过程中的容错问题.如何解决.
如我有个事物,在更新第一表的时候正常,第二张表的时候出现异常,如何处理?
以上两个问题我需要详细的代码.
请各位三层高手或者对该问题感兴趣的朋友能够给予帮助,多谢了
可能提的问题还不是很明确,请多多包含啊!

解决方案 »

  1.   

    没人回答啊?那我先详细问个问题
    在客户端用CLIENTDATASET时,我想在表table1中增加一条数据,并且table2中也相应增加一条,如何在中间层实现?
    结构如下:
    table1:
    id varchar(10)
    name varchar(20)
    id1 varchar(10)
    table2:
    id1 varchar(20)
    name1 varchar(20)
    1.客户端实现方式
    客户端代码部分:
    ClientDataSet1.ApplyUpdates(0)
    ClientDataSet2.ApplyUpdates(0)
    但我不想这样实现因为该窗口只是显示ClientDataSet1的数据
    2.中间层实现方式代码部分
    a.客户端代码部分:
    var qCoor:IMTSDemoQueryCoor;
        vDatas:OleVariant;
    begin
      qCoor:=CoMTSDemoQueryCoor.CreateRemote('127.0.0.1');
    //我如何把要添加的数据传给变量vDatas?
      qCoor.Inserttable1(vDatas);
    end
    b.中间层代码部分:
    我如何获取传过来要添加的数据啊?
    求教各位了!
      

  2.   

    老大,我都等了一个下午了,才有你老人家回个贴
    我想在细问一下,用MTS如何在逻辑层(中间层)与数据层(服务端)进行通讯(我用的是MTS OBJECT+MTS DATA),实现数据的处理啊(是多表)?(添加,删除,修改)我不调用存储过程如何实现啊?
    可否给个例子啊?或者在我上面的代码中添加,急啊
    多谢了
      

  3.   

    李维在《Delphi 5 ADO/MTS/Com+》一书中说得比较清楚,要在中间层实现
    Update1(vdatas:Olevariant,imaxError:integer,ierrorsCount:integer)方法,
    Update2(vdatas:Olevariant,imaxError:integer,ierrorsCount:integer)方法,
    Update3(vdatas:Olevariant,imaxError:integer,ierrorsCount:integer)方法;
    再在客户端调用该方法, qCoor.update1(ClientDataSet1.Delta,0);
    qCoor.update2(ClientDataSet2.Delta,0);
    qCoor.update3(ClientDataSet3.Delta,0);
    同时,你要自己控制事务处理的方法,在服务器端还要这样写
    procedure TDataModule1.ADODataset1BeforePost(DataSet:TDataSet);
    begin
      if not ADOConnection1.InTransaction then
      ADOConnection1.BeginTrans
      else
        showmessage('已有别的工作在做,请稍等后再试...')
    end;procedure TDataModule1.ADODataset3AfterPost(DataSet:TDataSet);
    begin
        ADOConnection1.CommitTrans;
    end;procedure TDataModule1.ADODataSet1PostError(DataSet: TDataSet;
      E: EDatabaseError; var Action: TDataAction);
    begin
      ADOConnection1.RollbackTrans;
      Action:=daAbort;end;procedure TDataModule1.ADODataSet2PostError(DataSet: TDataSet;
      E: EDatabaseError; var Action: TDataAction);
    begin
      ADOConnection1.RollbackTrans;
      Action:=daAbort;
    end;procedure TDataModule1.ADODataSet1PostError(DataSet: TDataSet;
      E: EDatabaseError; var Action: TDataAction);
    begin
      ADOConnection1.RollbackTrans;
      Action:=daAbort;
    end;如果你不用主从控制,就只能这样写了,不过这是个非常不好的设计,不仅享受不到MTS
    的好处,还要自己写代码来维护事务的完整性,真惨!
      

  4.   

    你要在ClientDataSet2中相应增加ClientDataSet1的记录可以这样:
    vdatas:=ClientDataSet1.data;
    ClientDataSet1.AppendData(Vdatas,true);
    然后再用qCoor.update方法;
      

  5.   

    to :jmhlp(网事如风) 
    我想用MTS OBJECT+MTS MOUDULE,如何写啊?
    烦劳了,可否给你例子
      

  6.   

    各位请指教,并提出指正:
    客户端(插入代码):
    procedure TForm1.Button4Click(Sender: TObject);
    var qCoor:IMTSDemoQueryCoor;
        vDatas: array of string;
    begin
      qCoor:=CoMTSDemoQueryCoor.CreateRemote('127.0.0.1');
      SetLength(vDatas,2);
      vDatas[0]:=Edit1.Text;
      vDatas[1]:=Edit2.Text;
      qCoor.InsertPublishers(vDatas[0],vDatas[1]);
    end;
    业务层(更新代码):
    procedure TMTSDemoQueryCoor.InsertPublishers(const vDatas1,
      vDatas2: WideString);
    var Publishers : IMTSPublishers;
    begin
      //InsertPublishers
      if not assigned(Publishers) then
        Publishers := CoMTSPublishers.Create;
      Publishers.InsertPublishers(vDatas1,vDatas2);
    end;
    数据处理层(更新代码):
    procedure TMTSPublishers.InsertPublishers(const vData1,
      vData2: WideString);
    begin
      try
        ADOCPublishers.BeginTrans;
        ADOQUpdate.Close;
        ADOQUpdate.SQL.Clear;
        ADOQUpdate.SQL.Add('Insert into Publishers (VID,PublisherName) values (:VID,:PublisherName)');
        ADOQUpdate.Parameters.ParamByName('VID').Value:=vData1;
        ADOQUpdate.Parameters.ParamByName('PublisherName').Value:=vData2;
        ADOQUpdate.ExecSQL;
        ADOQUpdate.Close;
        ADOQUpdate.SQL.Clear;
        ADOQUpdate.SQL.Add('Insert into Books (VID,BookID,BookName) values (:VID,:BookID,:BookName)');
        ADOQUpdate.Parameters.ParamByName('VID').Value:='';
        ADOQUpdate.Parameters.ParamByName('BookID').Value:='';
        ADOQUpdate.Parameters.ParamByName('BookName').Value:='测试';
        ADOQUpdate.ExecSQL;
        ADOCPublishers.CommitTrans;
        //SetComplete;
      except
        ADOCPublishers.RollbackTrans;
        //SetAbort;
      end;
    end;
    谢谢了