1. 程式人生 > >TStream實現多表提交

TStream實現多表提交

TStream實現多表提交

function TynFiredac.SaveDatas(const ATableName, ATableName2: string; ADeltas: TStream; AStorageFormat: string = 'binary'): string;
var
  LStream1, LStream2: TStream;
begin
  Result := 'false';
  if (ATableName = '') or (ADeltas = nil) or (ATableName2 = '') then
    Exit;

  LStream1 := TMemoryStream.Create;
  LStream2 := TMemoryStream.Create;
  TynStream.SplitStream(ADeltas, LStream1, LStream2);
  LStream1.Position := 0;
  LStream2.Position := 0;
  try
    try
      if not FDConnection1.InTransaction then
        FDConnection1.StartTransaction; // 開啟事務
      FDQuery1.Close;                   // 儲存表一
      FDQuery1.sql.Clear;
      FDQuery1.CachedUpdates := True;
      FDQuery1.UpdateOptions.UpdateTableName := ATableName;
      FDQuery1.sql.Text := 'select * from ' + ATableName + ' where 1=2';
      FDQuery1.LoadFromStream(LStream1, TynStream.GetFDStorageFormat(AStorageFormat));
      if FDQuery1.ApplyUpdates = 0 then
      begin
        Result := 'true';
      end
      else
      begin
        Result := 'false';
        FDConnection1.Rollback; // 回滾事務
        Exit;                   // 儲存表一發生錯誤,表二就不用再提交
      end;

      FDQuery1.Close;                // 儲存表二
      FDQuery1.sql.Clear;
      FDQuery1.CachedUpdates := True;
      FDQuery1.UpdateOptions.UpdateTableName := ATableName2;
      FDQuery1.sql.Text := 'select * from ' + ATableName2 + ' where 1=2';
      FDQuery1.LoadFromStream(LStream2, TynStream.GetFDStorageFormat(AStorageFormat));
      if FDQuery1.ApplyUpdates = 0 then
      begin
        Result := 'true';
        FDConnection1.Commit;  // 提交事務
      end
      else
      begin
        Result := 'false';
        FDConnection1.Rollback; // 回滾事務
      end;
    except
      on E: Exception do
      begin
        Result := 'false';
        FDConnection1.Rollback; // 回滾事務
        Log.WriteLog('TynFiredac.SaveDatas ' + E.Message);
      end;
    end;
  finally
    LStream1.Free;
    LStream2.Free;
    FDQuery1.Close;
    FDConnection1.Close;
  end;
end;