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 コンポーネントはインターフェイスにキャストできます。上記の場合、インターフェイスではなく ExecuteSQLTask クラスに COM コンポーネントをキャストしていました。

XML を介して SQL タスクのプロパティを設定するよりも、COM コンポーネントをキャストする方がはるかに簡単であることがわかりました。

于 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 に答える