DataSnap – Tparams를 이용한 멀티 테이블 트랜잭션 업데이트
                                            
 2687 단어  Delphi
                    
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, '   ', ptInput);//      
    aPar.AsBytes := ClientDataSet1.Delta;
  end;
  if ClientDataSet2.ChangeCount > 0 then
  begin
    aPar := aParams.CreateParam(ftVarBytes, '     ', 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;
  다음으로 이동:http://www.cnblogs.com/hnxxcxg/p/6897116.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[Delphi] TStringBuilder그리고 꼭 사용해야만 할까? 그림처럼 Heap 영역에 "Hello" 공간을 생성하고 포인팅을 한다. "Hello World" 공간을 새로 생성한 후 포인팅을 하게 된다. 결국 "Hello" 라는 String 객체가 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.