如何以编程方式创建SSIS执行SQL任务?

时间:2013-01-21 10:21:48

标签: vb.net ssis

我在vb.net 4.0版中为SQL Server 2008 R2以编程方式创建了一个SSIS包,我在创建执行SQL任务时遇到了困难。该任务的代码如下:

  Public Sub CreateExecuteSQLTask()
    Dim TaskHost =  DirectCast(Package.Executables.Add("Microsoft.SqlServer.Dts.Tasks.ExecuteSQLTask.ExecuteSQLTask, Microsoft.SqlServer.SQLTask, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"), Microsoft.SqlServer.Dts.Runtime.TaskHost) 
    TaskHost.Name = "Task"
    TaskHost.Description = "Task Description"
    Dim ExecuteSQLTask As Dts.Tasks.ExecuteSQLTask.ExecuteSQLTask
    ExecuteSQLTask = DirectCast(TaskHost.InnerObject, ExecuteSQLTask)
    ExecuteSQLTask.Connection = DestinationDBConnectionManager.ID
    ExecuteSQLTask.SqlStatementSource = "Select * from Employees"
  End Sub

当上面的代码运行时,在将TaskHost转换为Execute SQL命令时会出现以下异常。

  

无法将类型为'System .__ ComObject'的COM对象强制转换为类类型'Microsoft.SqlServer.Dts.Tasks.ExecuteSQLTask.ExecuteSQLTask'。表示COM组件的类型实例不能转换为不代表COM组件的类型;但是只要底层的COM组件支持对接口的IID的QueryInterface调用,它们就可以转换为接口。

我使用以下文章作为参考:

Creating Packages in code

请告知我如何解决这个问题。

2 个答案:

答案 0 :(得分:1)

我设法解决了这个问题。

Dim ExecuteSQLTask As Dts.Tasks.ExecuteSQLTask.ExecuteSQLTask

需要更改为

Dim ExecuteSQLTask As Dts.Tasks.ExecuteSQLTask.IExecuteSQLTask

正如建议的例外,COM组件可以转换为接口。在上面的例子中,我将COM组件转换为ExecuteSQLTask类而不是接口。

我发现转换COM组件比通过XML设置SQL任务的属性容易得多。

答案 1 :(得分:0)

Your problem is .Net 4.0.或者更具体地说,ExecuteSQLTask汇编代码中有一些东西使它与.Net 4.0不兼容。所以只需将以下行添加到app.config文件中:

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<runtime>
  <NetFx40_LegacySecurityPolicy enabled="true"/>
</runtime>

它会起作用。不,我不知道为什么。