0

パッケージを実行すると、有効な問題が発生しました。私のPCでは失敗し、他の人では成功しました。このエラーは、スクリプト コンポーネント (赤くなっている) が原因であり、スクリプト コンポーネントでの実行後ではなく、実行後フェーズにありますが、パッケージのランタイムにあります。エラーは次のとおりです。

Information: 0x40043008 at Data Flow Task, SSIS.Pipeline: Post Execute phase is beginning.
Error: 0xC0047062 at Data Flow Task, Script Component [263]: System.InvalidCastException: Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSVariables100'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{22992C1D-393D-48FB-9A9F-4E4C62441CCA}' failed due to the following error: The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD)).

ここに画像の説明を入力

変数に関連するすべてのコードを削除すると、パッケージが正常に実行されるため、問題は変数に関連していると思います。スクリプト コンポーネントのコード:

private int scheduled550;
private int scheduled620;
private int scheduled720;
private int scheduled820;
public override void PreExecute()
{

    base.PreExecute();
    scheduled550 = Variables.Count550;
    scheduled620 = Variables.Count620;
    scheduled720 = Variables.Count720;
    scheduled820 = Variables.Count820;

}

public override void PostExecute()
{
    base.PostExecute();

}

誰かが同じ問題に遭遇したことがありますか? POST Execute フェーズで何が行われるか教えてもらえますか? ありがとう

詳細情報: SQL Server を再インストールしようとしましたが、役に立ちません。また、変数を含むすべてのスクリプト コンポーネントが SSIS での実行に失敗したわけではありません (エラー 1 と同じパッケージではありません)。

4

1 に答える 1

0

SSIS 内のすべてのタスク/コンテナーのライフサイクルは同じです。イベント ハンドラーが起動するのを見ると、その一部を確認できます。スクリプト コンポーネントでは、データ フロー タスク内で、さまざまな手順を実行します。その一部は検証です(この契約では、このテーブルから整数型の列が必要であると述べています-接続できるか、存在するか、正しい型かなど)。

検証後、タスクには実行するセットアップと破棄のステップがあります。スクリプトで SSIS 変数を操作しているように見えるため、その前後の実行時間の一部は、変数 (SSIS) から変数 (.net) への変換とその逆の変換に費やされます。

失敗の原因となった PostExecute メソッドの特定のコードを確認するまで、コードの問題が何であったかを述べることができません。

問題を再現できません。これは Integration Services の 2012 リリースですが、使用しているスクリプト コンポーネントは同じように動作します。出力を Excel に送信しませんでしたが、スクリプトが失敗しているので問題ありません。

データ フロー タスク

私のスクリプト コンポーネント。コードを編集する前に、メニューで変数 User::Count550 を ReadOnly 変数として選択しました。

public class ScriptMain : UserComponent
{
    private int scheduled550;

    public override void PreExecute()
    {
        base.PreExecute();
        this.scheduled550 = Variables.Count550;
    }

    public override void PostExecute()
    {
        base.PostExecute();
        //this.Variables.Count550 = scheduled550;
        //this.VariableDispenser.LockForWrite("Count550");
    }

    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        if (true)
        {
            this.scheduled550++;
        }
    }

}
于 2013-07-18T02:12:50.657 に答える