如何在使用TSocketConnection的三层结构中应用事务(在服务器端)。
我已经查询了许多帖子,没有令我感到满意的答案,难道在三层中(单单midas没有结合使用MTS,CORBA)中就无法使用C/S结构下的BeginTrans等方法了吗?望指教。谢谢

解决方案 »

  1.   

    在接口方法中:服务器
    procedure Trdsales.updatedatabase(const data:olevariant);
    var
      i:integer;
    begin
      aqinfo.BeginTrans;
      bpprovider.Dspmain.ApplyUpdates(data,-1,i);
      if i>=1 then
      begin
        aqinfo.rollrans;
      end else
      begin
         aqinfo.commtrans;
      end;
    end;客户
     
    data:olvariant;
    data:=cds.delta;
    dm.socket.appserver.updatabase(data);
      

  2.   

    感谢参与,我也是这么做的,不过我是Save(const Data, Providers: OleVariant);Data和Providers是对应的两个数组,一个用来存Delta一个用来存对应的Provider,我非常想知道这样做是否最好,还有没有更好的方法。再次感谢。
      

  3.   

    LINXIONGMING(ERP的工作者) 你说什么呢,^o^,我看不懂。
      

  4.   

    with ADOConnection1 do
          begin
           try
             begintrans;                                            //启动Transcation
             With ADOStoredProc_BaseInfo_Insert do
               begin
                 ADOStoredProc_BaseInfo_Insert.Connection:=ADOConnection1;
                 ADOStoredProc_BaseInfo_Insert.ProcedureName:='P_BaseInfo_insert_1;1';
             {    Close;
                 SQL.Clear;
                 SQL.Add(SQL_BaseInfo_Insert);}
                 Parameters.ParamValues['@Gtin_2']:=vartostr(Gtin1); 
                Prepared;
                Execproc;
                showmessage('事务执行成功!');
             end;
                 committrans;
          Except
            begin
               rollbacktrans;
                showmessage('事务执行失败!');
            //    exit;
          end;
       end;
      

  5.   

    To:rocker1218(rocker1218) ,呵呵没问题,不过你都用存储过程了,干吗不直接在存储过程中应用事务呢?在存储过程中 raise error返回不就可以了。不过本人讨厌使用存储过程,我SQL语句的应用能力有限,象SQLSERVER中的IsNull()函数还是昨儿个才知道的。
      

  6.   

    复:netwizard(流星雨)  你的方法可以,但是最好是一个通用的方法,且不必传递PROVIDER这个参数
      

  7.   

    To:Erice(白雪公猪) 如果不传Provider 这个参数我如何知道更新到那个数据集上,你那个方法最让我迷惑的也就在这里了,我试过如果用一个公共的Provider接受数据更新会提示错误,错误信息我忘了是什么了,大概是数据库引擎不知如何更新数据。
    你的公共方法是怎么实现的望指教。
      

  8.   

    复:Erice(白雪公猪) 
    如果不传Provider参数我如何将数据更新回特定的数据集呢?你提供的方法让我迷惑的也就是在这里,我试过如果用公共的Provider接受数据更新会导致错误:错误内容大概是数据库引擎不知如果处理要更新的数据。你的公共的方法是如何做到的,万望不吝赐教。