2011-02-02 3 views
8

Я должен предисловие, сказав, что мой опыт написания сценариев или программирования на языках ООП ограничен.Сборка пакетов SSIS в PowerShell

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

У меня, однако, был найден ряд ресурсов для VB/C# для создания пакетов SSIS.

Example resource here.

Я удалось превратить большую часть кода, вызывая сборки 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) 

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

Cannot convert the "System.__ComObject" value of type "System.__ComObject#{}" to type "Microsoft.SqlServer.Dts.Pipeline.Wrapper.MainPipeClass"

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

+1

Я поднимаю этот старый вопрос, потому что не понимаю, почему он имеет downvotes =/ – jadarnel27

+2

@ jadarnel27 - они в основном мешают downvotes. Я разозлил кого-то, и они остановили несколько вопросов, которые я задал (потому что они свободны, чтобы опросить вопросы). Я ценю ваше чувство справедливости. – JNK

ответ

3

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]) 

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

+0

Я отказался от этого проекта на данный момент (я редактирую xml напрямую), но это меня закрыло! – JNK

1

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

+0

Предположим, что по соображениям безопасности он должен быть автономным сценарием powershell, который будет выполняться с SQL Server. – JNK