Сборка служб SSIS в PowerShell - PullRequest
       12

Сборка служб SSIS в PowerShell

8 голосов
/ 02 февраля 2011

В предисловии я должен сказать, что мой опыт написания сценариев или программирования на языках ООП ограничен.

Я работаю над способом программного создания и выполнения пакетов служб SSIS с помощью PowerShell. К сожалению, большинство ресурсов, доступных для PowerShell и SSIS, предназначены для вызова PS из SSIS, а не наоборот.

Однако я нашел несколько ресурсов для VB / C # для создания пакетов служб SSIS.

Пример ресурса здесь.

Мне удалось преобразовать большую часть кода, вызвав сборки DTS / SSIS, но теперь не удается преобразовать объект TaskHost в магистральный трубопровод.

Пример кода:

[Void][Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.ManagedDTS')
[Void][Reflection.Assembly]::LoadWithPartialName('Microsoft.Sqlserver.DTSPipelineWrap')

# Create the Package and application, set its generic attributes

$Package = New-Object Microsoft.SqlServer.Dts.Runtime.Package
$Package.CreatorName = $CreatorName

$App = New-Object Microsoft.SqlServer.Dts.Runtime.Application

# Set connection info for our package

$SourceConn = $package.Connections.Add("OLEDB")
$SourceConn.Name = "Source Connection"
$SourceConn.set_ConnectionString("Data Source=$SourceServer;Integrated Security=True")

$TargetConn = $package.Connections.Add("OLEDB")
$TargetConn.Name = "Target Connection"
$TargetConn.set_ConnectionString("Data Source=$TargetServer;Integrated Security=True")

# Build the tasks

# Data Flow Task - actually move the table

[Microsoft.SQLServer.DTS.Runtime.Executable]$XferTask = $Package.Executables.Add("STOCK:PipelineTask")

$XferTaskTH = [Microsoft.SqlServer.Dts.Runtime.TaskHost]$XferTask

$XferTaskTH.Name = "DataFlow"
$XferTaskTH.Description = "Dataflow Task Host"

$DataPipe = [Microsoft.SQLServer.DTS.pipeline.Wrapper.MainPipeClass]($XferTaskTH.InnerObject)

Все работает до последней строки, когда я получаю сообщение об ошибке:

Невозможно преобразовать "System .__ ComObject" значение типа "System .__ ComObject # {}" для тип "Microsoft.SqlServer.Dts.Pipeline.Wrapper.MainPipeClass"

Любая помощь или идеи приветствуются!

Ответы [ 2 ]

3 голосов
/ 04 февраля 2011

Microsoft.SqlServer.DTSPipelineWrap интенсивно использует экземпляры COM.

В этом сообщении на форуме предлагается использовать метод CreateWRapperOfType: http://social.technet.microsoft.com/Forums/en-US/ITCG/thread/0f493a31-fbf0-46ac-a6a5-8a10af8822cf/

Вы можете попробовать это:

$DataPipe = [System.Runtime.InteropServices.Marshal]::CreateWrapperOfType($XferTaskTH.InnerObject, [Microsoft.SQLServer.DTS.pipeline.Wrapper.MainPipeClass])

Не выдает ошибку и создает объект - яя не уверен, какого типа.

1 голос
/ 02 февраля 2011

Вы всегда можете просто скомпилировать рабочую версию .NET, на которую вы ссылались выше, в исполняемый файл и позволить ему принимать параметры по мере необходимости для создания пакетов служб SSIS. Затем используйте Powershell для вызова исполняемого файла с необходимыми параметрами.

...