0

我正在为 SQL server 2008 R2 以编程方式在 vb.net 4.0 版中创建一个 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 调用,它们就可以转换为接口。

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

在代码中创建包

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

4

2 回答 2

1

我设法解决了这个问题。

Dim ExecuteSQLTask As Dts.Tasks.ExecuteSQLTask.ExecuteSQLTask

需要改为

Dim ExecuteSQLTask As Dts.Tasks.ExecuteSQLTask.IExecuteSQLTask

正如异常所建议的,COM 组件可以转换为接口。在上述情况下,我将 COM 组件转换为 ExecuteSQLTask 类而不是接口。

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

于 2013-01-24T09:08:47.817 回答
0

你的问题是.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>

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

于 2013-01-23T22:14:21.730 回答