我在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调用,它们就可以转换为接口。
我使用以下文章作为参考:
请告知我如何解决这个问题。
答案 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>
它会起作用。不,我不知道为什么。