Сборка пакетов служб SSIS в PowerShell
Я должен предварить, сказав, что мой опыт написания сценариев или программирования на языках ООП ограничен.
Я работаю над методом программного создания и выполнения пакетов служб SSIS с помощью PowerShell. К сожалению, большинство ресурсов, доступных для PowerShell и SSIS, предназначены для вызова PS из SSIS, а не наоборот.
однако я нашел ряд ресурсов для VB / C# для создания пакетов служб SSIS.
мне удалось преобразовать большую часть кода, вызвав сборки DTS/SSIS, но теперь он терпит неудачу при преобразовании объекта TaskHost в mainpipe.
пример кода:
[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)
все работает нормально до последней строки, когда я получаю ошибку:
Не удается преобразовать "Система.__ComObject" значение типа "Система.__ComObject# {} " to тип "Microsoft.От SQLServer.Белая горячка.Трубопровод.Обертка.MainPipeClass"
любая помощь или идеи приветствуются!
2 ответов
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])
Не ошибается и создает объект-я не уверен, какой тип.
вы всегда можете просто скомпилировать рабочую версию .NET, на которую вы ссылались выше, в exe и позволить ей принимать параметры по мере необходимости для создания пакетов служб SSIS. Затем используйте Powershell для вызова исполняемого файла с необходимыми параметрами.