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

来源:互联网 发布:龙华行知实验小学排名 编辑:程序博客网 时间:2024/05/20 17:24


         网上看到的主从表更新多是传递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进行多表事务更新

原创粉丝点击