Создание собственного компонента для SSIS

Немного информации по разработке компонентов для SSIS.

Методы режима проектирования (Design-Time)

ProvideComponentProperties

Метод выполняется один раз при добавлении компонента на схему данных.

Метод позволяет определить параметры компонента:

  • входные (Input) потоки;
  • выходные (Output) потоки, включая потоки ошибок;
  • пользовательские параметры (Custom Property);
  • выходные колонки данных (если они никак не зависят от входных колонок и буду присутствовать в выходном потоке в любом случае).

Если вам не нужны пользовательские параметры и выходной поток ошибок, то метод можно не переопределять — по умолчанию будет создан один входной и один выходной синхронный поток.

Простейшая реализация метода выглядит следующим образом:

public override void ProvideComponentProperties()
{
	// Применяем настройки потоков по умолчанию.
	base.ProvideComponentProperties();

	// Добавляем пользовательский параметр.
	var myProperty = ComponentMetaData.CustomPropertyCollection.New();
	myProperty.Name = "My Custom Property";
	myProperty.Description = "Description of my castom property";
	myProperty.Value = "Default value of my castom property";

	// Добавляем выходной поток ошибок.
	var errorOutput = ComponentMetaData.OutputCollection.New();
	errorOutput.IsErrorOut = true;
	errorOutput.Name = "Error";
}

Если требуется переопределить стандартные потоки, то реализация метода может выгдялеть следующим образом:

public override void ProvideComponentProperties()
{
	// Добавляем пользовательский параметр.
	var myProperty = ComponentMetaData.CustomPropertyCollection.New();
	myProperty.Name = "My Custom Property";
	myProperty.Description = "Description of my castom property";
	myProperty.Value = "Default value of my castom property";

	// Добавляем входной поток.
	var input = ComponentMetaData.InputCollection.New();
	input.Name = "Input";

	// Добавляем выходной поток.
	var output = ComponentMetaData.OutputCollection.New();
	output.Name = "Output";
	output.SynchronousInputID = input.ID; //Synchronous transformation

	// Добавляем выходную колонку.
	var outColumn = output.OutputColumnCollection.New();
	outColumn.Name = "Out1";
	outColumn.Description = "Column desctiption";
	outColumn.SetDataTypeProperties(DataType.DT_STR, 256, 0, 0, 1251);

	// Добавляем выходной поток ошибок.
	var errorOutput = ComponentMetaData.OutputCollection.New();
	errorOutput.IsErrorOut = true;
	errorOutput.Name = "Error";
}
Замечание

При добавлении колонки в поток необходимо, чтобы свойство Description содержало значение и было не нулевым. В противном случае при работе с компонентом будет появляться ошибка Value does not fall within the expected range.

OnInputPathAttached

Метод вызывается при подключении входного потока к компоненту.

OnOutputPathAttached

Метод вызывается при подключении выходного потока компонента.

SetComponentProperty

Метод вызывается при установке значения пользовательскому свойству.

ReinitializeMetaData

Метод вызывается при нажатии кнопки Refrech или когда метод Validate возвращает статус DTSValidationStatus.VS_NEEDSNEWMETADATA.

Validate

Метод вызывается при изменении связей, входных колонок, а также перед выполнением пакета.

Метод проверяет корректность настройки потоков и параметров компонента.

В методе не рекомендуется изменять содержимое ComponentMetaData, т.е.  в методе не стоит, например, создавать колонки в выходном потоке. Метод должен только проверять корректность потоков и параметров и, в случае необходимости, возвращать статус DTSValidationStatus.VS_NEEDSNEWMETADATA, в результате чего будет запущен метод ReinitializeMetaData.

Методы режима выполнения (Runtime)

PerformUpdate

Метод выполняется один раз перед выполнением пакета.

Типичное содержимое метода:

public override void PerformUpgrade(int pipelineVersion)
{
    var customAttribute = (DtsPipelineComponentAttribute)Attribute.GetCustomAttribute((MemberInfo)GetType(), typeof(DtsPipelineComponentAttribute), false);
    ComponentMetaData.Version = customAttribute.CurrentVersion;
}

PreExecute

Метод выполняется один раз перед выполнением пакета.

Как правило, в этом методе формируют объекты, позволяющие сопоставить имена колонок входных и выходных потоков и ех индексов в буферах (так как при работе с буферами входных и выходных данных используются именно индексы колонок, а не имена).

private ColumnInfo[] _inputBufferColumnIndex;
private ColumnInfo[] _outputBufferColumnIndex;


private class ColumnInfo
{
	public int BufferColumnIndex { get; set; }
	public string ColumnName { get; set; }
}


public override void PreExecute()
{
	base.PreExecute();

	var input = ComponentMetaData.InputCollection[0];
	_inputBufferColumnIndex = new ColumnInfo[input.InputColumnCollection.Count];
	for (var x = 0; x < input.InputColumnCollection.Count; x++)
	{
		var column = input.InputColumnCollection[x];
		_inputBufferColumnIndex[x] = new ColumnInfo
		{
			BufferColumnIndex = BufferManager.FindColumnByLineageID(input.Buffer, column.LineageID),
			ColumnName = column.Name
		};
	}

	var output = ComponentMetaData.OutputCollection[0];
	_outputBufferColumnIndex = new ColumnInfo[output.OutputColumnCollection.Count];
	for (var x = 0; x < output.OutputColumnCollection.Count; x++)
	{
		var column = output.OutputColumnCollection[x];
		_outputBufferColumnIndex[x] = new ColumnInfo
		{
			// input.Buffer - для синхронного выходного потока здесь 
			// должен быть именно входящий буфер - это требование 
			// для синхронных потоков.
			BufferColumnIndex = BufferManager.FindColumnByLineageID(input.Buffer, column.LineageID),
			ColumnName = column.Name
		};
	}
}

Разработка компонента

Номер версии

Для компонента необходимо указывать номер версии.

[DtsPipelineComponent(
    DisplayName = "My Component", 
    CurrentVersion = 2, 
    ComponentType = ComponentType.Transform, 
    IconResource = "SSIS.Components.icon.ico")]
public class MyComponent : PipelineComponent
{
    ...    
}

Библиотеки

SQL Server 2014

  • Microsoft.SQLServer.DTSPipelineWrap
    C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SqlServer.DTSPipelineWrap\v4.0_12.0.0.0__89845dcd8080cc91\Microsoft.SQLServer.DTSPipelineWrap.dll
  • Microsoft.SqlServer.DTSRuntimeWrap
    C:\Windows\Microsoft.NET\assembly\GAC_32\Microsoft.SqlServer.DTSRuntimeWrap\v4.0_12.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.DTSRuntimeWrap.dll
  • Microsoft.SqlServer.ManagedDTS
    C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SqlServer.ManagedDTS\v4.0_12.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.ManagedDTS.dll
  • Microsoft.SQLServer.PipelineHost
    C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SqlServer.PipelineHost\v4.0_12.0.0.0__89845dcd8080cc91\Microsoft.SQLServer.PipelineHost.dll

SQL Server 2016

  • Microsoft.SQLServer.DTSPipelineWrap
    C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SqlServer.DTSPipelineWrap\v4.0_13.0.0.0__89845dcd8080cc91\Microsoft.SQLServer.DTSPipelineWrap.dll
  • Microsoft.SqlServer.DTSRuntimeWrap
    C:\Windows\Microsoft.NET\assembly\GAC_32\Microsoft.SqlServer.DTSRuntimeWrap\v4.0_13.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.DTSRuntimeWrap.dll
  • Microsoft.SqlServer.ManagedDTS
    C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SqlServer.ManagedDTS\v4.0_13.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.ManagedDTS.dll
  • Microsoft.SQLServer.PipelineHost
    C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SqlServer.PipelineHost\v4.0_13.0.0.0__89845dcd8080cc91\Microsoft.SQLServer.PipelineHost.dll

В свойствах библиотек параметр Embed Interop Types должны иметь значение False.

Ссылки

About the author

Добавить комментарий

Сказать спасибо

Способ платежа:

Подписаться на обновления

Укажите свой e-mail чтобы получать уведомления о новых статьях.

Присоединиться к еще 1 подписчику