Программно добавить Aggregate Transform - Count Distinct в пакет служб SSIS - PullRequest
2 голосов
/ 12 апреля 2019

Я работаю над программным созданием Aggregate-преобразования с типом агрегации как различного количества, и я могу создать другие агрегаты, такие как min, max, count ... но когда дело доходит до подсчета, я получаю ошибку ниже

Компонент обнаружил потенциальное повреждение метаданных во время проверки.Ошибка в задаче потока данных - счетчик нагрузки Dist [Aggregate - All [2]]: в «Aggregate - All.Outputs [Aggregate Output 1] .Columns [col1]» отсутствует обязательное свойство «CountDistinctScale».Объект должен иметь указанное настраиваемое свойство.

Мне не удается найти настраиваемое свойство "CountDistinctScale", так как это настраиваемое свойство не закрывается для других агрегатов и волшебным образом появляется, когда выбрано различное число,Есть ли метод, который мне нужно вызвать для создания нового пользовательского свойства?

Я понимаю, что не так много людей, которые знают, как программно создать пакет, пожалуйста, помогите мне найти кого-то со знаниями или предложить мне, как яможно получить помощь.

IDTSComponentMetaData100 Aggregate = pipeline.ComponentMetaDataCollection.New();
            Aggregate.ComponentClassID = app.PipelineComponentInfos["Aggregate"].CreationName;
            // Get the design time instance of the derived column
            var DesignAggregate = Aggregate.Instantiate();
            DesignAggregate.ProvideComponentProperties();        //design time

            Aggregate.Name = "AggregateComponent";               

            IDTSPath100 AggregatePath = pipeline.PathCollection.New();
            AggregatePath.AttachPathAndPropagateNotifications(pipeline.ComponentMetaDataCollection[Prev_Transform.Transformation_Name].OutputCollection[Prev_Transform.Output_Number], Aggregate.InputCollection[0]);


            //update the metadata for the derived columns
            DesignAggregate.AcquireConnections(null);
            DesignAggregate.ReinitializeMetaData();
            DesignAggregate.ReleaseConnections();


            // Mark the columns we are joining on
            IDTSInput100 AggregateInput = Aggregate.InputCollection[0];
            IDTSInputColumnCollection100 AggregateInputColumns = AggregateInput.InputColumnCollection;
            IDTSVirtualInput100 AggregateVirtualInput = AggregateInput.GetVirtualInput();
            IDTSVirtualInputColumnCollection100 AggregateVirtualInputColumns = AggregateVirtualInput.VirtualInputColumnCollection;

            IDTSOutput100 AggregateoutputCollection = Aggregate.OutputCollection[0];

            // Note: input columns should be marked as READONLY
            foreach (IDTSVirtualInputColumn100 vColumn in AggregateVirtualInputColumns)
            {
                int sourceColumnLineageId = AggregateVirtualInput.VirtualInputColumnCollection[vColumn.Name].LineageID;
                DesignAggregate.SetUsageType(AggregateInput.ID, AggregateVirtualInput, sourceColumnLineageId, DTSUsageType.UT_READONLY);

                // create a new output column
                IDTSOutputColumn100 newOutputColumn = DesignAggregate.InsertOutputColumnAt(AggregateoutputCollection.ID, 0,  vColumn.Name, string.Empty);

                // set the data type porperties to the same values as these of the input column   
                newOutputColumn.SetDataTypeProperties(AggregateVirtualInput.VirtualInputColumnCollection[vColumn.Name].DataType, AggregateVirtualInput.VirtualInputColumnCollection[vColumn.Name].Length, 0, 0, AggregateVirtualInput.VirtualInputColumnCollection[vColumn.Name].CodePage);

                newOutputColumn.MappedColumnID = 0;
                for (int i = 0; i < newOutputColumn.CustomPropertyCollection.Count; i++)
                {
                    IDTSCustomProperty100 property = newOutputColumn.CustomPropertyCollection[i];
                    switch (property.Name)
                    {
                        case "AggregationColumnId":
                            property.Value = sourceColumnLineageId;
                            break;
                        case "AggregationType":
                            property.Value = 3;
                            break;
                        case "IsBig":
                            property.Value = 1;
                            break;
                        case "AggregationComparisonFlags":
                            property.Value = 0;
                            break;
                    }
                }

            }
...