DataSnap开发:利用TParams进行多表事务更新



         网上看到的主从表更新多是传递Olevariant进行更新,其实可以直接利用TParams来传递多个数据集进行更新。

 服务端代码如下:

function TSVRDM.multUpdatesByPar(UpdateParam: TParams; out ErrMsg: string): OleVariant;
 const
   aSQL = 'Select * from %s where 1<>1';
 var
   i: Integer;
   lQuery: TADOQuery;
   lProvider: TDataSetProvider;
   conn: TADOConnection;
   ErrorCount, MaxErrors: Integer;  
 begin
   Writeln(fguid + ':Mult-Table Update start ...');
   conn := ConnPool.Lock(dbConnStr);
   lQuery := TADOQuery.Create(NIL);
   lProvider := TDataSetProvider.Create(nil);
   Writeln(fguid + ': Start Transaction... ' );
   conn.BeginTrans;
   try
     try
       lQuery.Connection := conn;
       lProvider.DataSet := lQuery;

       for I := 0 to UpdateParam.Count-1 do begin
         Writeln(fguid + ': Update Table ' + UpdateParam[i].Name);

        lQuery.Close;
         lQuery.SQL.Clear;
        lQuery.SQL.Text := Format(aSQL, [UpdateParam[i].Name]);
        
         result := lProvider.ApplyUpdates(UpdateParam[i].AsBytes, 0, ErrorCount);
         ErrMsg := FErrMsg;
         if ErrorCount > 0 then
           raise Exception.Create(ErrMsg + '; TableName = '+UpdateParam[i].Name);
       end;
       conn.CommitTrans;
       Writeln(fguid + ': Transaction commited... Update finished!' );
     except
       on E: Exception do
       begin
         conn.RollbackTrans;
         Writeln(fguid + ':Transaction rollbacked! Update ERROR :' + E.Message);
       end;
     end;
   finally
     lProvider.Free;
     lQuery.Free;
     ConnPool.Unlock(conn);
     FErrMsg := '';
   end;

end;

        客户端调用:

procedure TMyClient.btn1Click(Sender: TObject);
var
   aParams: TParams;
   aPar: TParam;
   client: TDMClient;
   ErrMsg: string;
 begin

  // TClientDataSet的Data和Delta可用TParam.AsBytes直接传递
  aParams := TParams.Create(nil);
   if ClientDataSet1.ChangeCount > 0 then
   begin
     aPar := aParams.CreateParam(ftVarBytes, '数据表1', ptInput);
     aPar.AsBytes := ClientDataSet1.Delta;
   end;

  if ClientDataSet2.ChangeCount > 0 then
   begin
     aPar := aParams.CreateParam(ftVarBytes, '数据表2', ptInput);
     aPar.AsBytes := ClientDataSet2.Delta;
   end;
   if aParams.Count = 0 then
     exit;

  client := TDMClient.Create(self.SQLConn.DBXConnection);
   try
     try
       client.multUpdatesByPar(aParams, ErrMsg);
       if ErrMsg <> '' then
         raise Exception.Create(ErrMsg)
       else
       begin
         ClientDataSet1.MergeChangeLog;
         ClientDataSet2.MergeChangeLog;
       end;
     except
       ON E: Exception do
       begin
         showmessage(E.Message);
       end;
     end;
   finally
     client.Free;
     
   end;
 end;


 DataSnap开发:利用TParams进行多表事务更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值