2011-02-02 43 views
8

Tôi nên bắt đầu bằng cách nói rằng kinh nghiệm của tôi với việc viết kịch bản hoặc lập trình bằng các ngôn ngữ OOP bị giới hạn.Lắp ráp các gói SSIS trong PowerShell

Tôi đang làm việc trên phương pháp tạo và thực hiện các gói SSIS theo chương trình bằng PowerShell. Thật không may, hầu hết các tài nguyên có sẵn cho PowerShell và SSIS là để gọi PS từ SSIS, không phải là cách khác xung quanh.

Tôi đã tìm thấy một số tài nguyên cho VB/C# để tạo các gói SSIS.

Example resource here.

tôi đã thành công trong việc chuyển đổi hầu hết các mã bằng cách gọi các hội DTS/SSIS, nhưng nó thất bại bây giờ chuyển đổi các đối tượng TaskHost đến một mainpipe. đang

mẫu:

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

Tất cả mọi thứ hoạt động tốt đến tận dòng cuối cùng, khi tôi nhận được lỗi:

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

Bất kỳ sự trợ giúp hay ý tưởng được hoan nghênh!

+1

Tôi upvoting câu hỏi cũ này bởi vì tôi không thấy lý do tại sao nó có downvotes =/ – jadarnel27

+2

@ jadarnel27 - họ chủ yếu là trả thù downvotes. Tôi bực bội một người nào đó và họ downvoted vài câu hỏi tôi đã hỏi (bởi vì nó miễn phí để downvote câu hỏi). Tôi đánh giá cao ý thức của bạn về sự công bằng. – JNK

Trả lời

3

Microsoft.SqlServer.DTSPipelineWrap sử dụng nhiều trường hợp COM.

bài diễn đàn này đề nghị sử dụng phương pháp CreateWRapperOfType: http://social.technet.microsoft.com/Forums/en-US/ITCG/thread/0f493a31-fbf0-46ac-a6a5-8a10af8822cf/

Bạn có thể thử này:

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

Không lôi ra và tạo ra một đối tượng - tôi không chắc chắn về những gì loại.

+0

Tôi đã từ bỏ dự án này ngay bây giờ (tôi đang chỉnh sửa trực tiếp xml) nhưng điều này khiến tôi đóng cửa! – JNK

1

Bạn luôn có thể biên dịch phiên bản .NET hoạt động mà bạn đã tham chiếu ở trên thành một exe và cho phép nó chấp nhận các tham số khi cần để tạo các gói SSIS. Sau đó, sử dụng Powershell để gọi thực thi với các tham số khi cần thiết.

+0

Giả sử vì lý do bảo mật, nó cần phải là một tập lệnh PowerShell độc lập sẽ được thực thi từ SQL Server. – JNK