我应该在前言中说我在OOP语言中使用脚本或编程的经验是有限的。
我正在研究一种使用PowerShell以编程方式创建和执行SSIS包的方法。不幸的是,PowerShell和SSIS可用的大部分资源都是用于从SSIS调用PS,而不是相反。
但是,我已经为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#{}”to 类型 “Microsoft.SqlServer.Dts.Pipeline.Wrapper.MainPipeClass”
欢迎任何帮助或想法!
答案 0 :(得分: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])
不会出错并产生一个对象 - 我不确定它是什么类型。
答案 1 :(得分:1)
您总是可以将上面引用的工作.NET版本编译为exe,并允许它根据需要接受参数以创建SSIS包。然后,使用Powershell根据需要使用参数调用可执行文件。