2011-02-02 10 views
8

Debo prologar diciendo que mi experiencia con scripting o programación en lenguajes OOP es limitada.Ensamblaje de paquetes SSIS en PowerShell

Estoy trabajando en un método para crear y ejecutar programáticamente paquetes de SSIS usando PowerShell. Desafortunadamente, la mayoría de los recursos disponibles para PowerShell y SSIS son para llamar a PS desde SSIS, y no al revés.

Sin embargo, he encontrado una cantidad de recursos para VB/C# para crear paquetes de SSIS.

Example resource here.

que he tenido éxito en la conversión de la mayoría del código llamando a las asambleas DTS/SSIS, pero está fallando ahora en convertir el objeto a una TaskHost mainpipe. código

muestra:

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

Todo funciona bien hasta la última línea, cuando me sale el error:

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

Cualquier ayuda o ideas son bienvenidas!

+1

Estoy votando esta vieja pregunta porque no veo por qué tiene downvotes =/ – jadarnel27

+2

@ jadarnel27 - en su mayoría son venganza downvotes. Enfadeé a alguien y rechazaron las pocas preguntas que hice (porque es gratis para rechazar preguntas). Aprecio tu sentido de justicia. – JNK

Respuesta

3

Microsoft.SqlServer.DTSPipelineWrap hace un uso intensivo de las instancias COM.

Este mensaje del foro sugirió utilizando el método CreateWRapperOfType: http://social.technet.microsoft.com/Forums/en-US/ITCG/thread/0f493a31-fbf0-46ac-a6a5-8a10af8822cf/

Usted podría intentar esto:

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

¿No de error y produce un objeto - no estoy seguro de qué tipo.

+0

Dejé este proyecto por el momento (estoy editando el xml directamente) pero esto me acercó. – JNK

1

Siempre puede simplemente compilar la versión .NET de trabajo que mencionó anteriormente en un exe, y le permite aceptar los parámetros necesarios para crear los paquetes de SSIS. Luego, use Powershell para llamar al ejecutable con los parámetros necesarios.

+0

Supongamos por razones de seguridad que debe ser un script autocontenido de powershell que se ejecutará desde SQL Server. – JNK

Cuestiones relacionadas