1

SSIS プロジェクトを使用して、データベース内のエントリと比較したいファイルがあります。

私の ControlFlow には、「スクリプト タスク」で比較したいデータベースから結果のリストを取得する「SQL タスクの実行」があります。私が知らない他のことがここで起こっていますが、「スクリプト タスク」に到達する前に for ループがあります。

初めて実行したときは正常に動作しますが、ファイルの 2 番目のエントリを試行すると、データベースの結果が失われます。データベースの結果を PreExecute() に入力することで、これを修正できました

private DataTable dt = new DataTable();

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

    OleDbDataAdapter adapter = new OleDbDataAdapter();
    //filling results from database into DataTable object
    adapter.Fill(dt, this.Variables.AccountFilterVariables); 

}

しかし、今では ControlFlow でループに入るたびに、 this.Variables.AccountFilterVariables に保持されている結果が失われています

「Execute SQL Task」をループに入れることでこれを修正できますが、毎回データベースベースにクエリを実行したくありません。データベースを一度クエリして、プロジェクトの存続期間中 this.Variables.AccountFilterVariables を保持したいだけです。

どうすればいいですか?PostExecute() と関係があると推測していますが、何が原因かわかりません。

制御の流れ

データフロー

4

1 に答える 1

0

私の記憶が正しければ、SQL 実行タスクによって作成されたレコードセットは前方スクロールのみのカーソル タイプであり、一度しか読み取れないことを意味します。

簡単な回避策は、SQL 実行タスクの直後にスクリプト タスクを追加することです。そのスクリプト タスクで、レコードセットを使用して DataTable を読み込み、その DataTable を別のパッケージ スコープ変数に格納します。次に、さまざまなループ内で、スクリプト コンポーネントが DataTable を参照できます。これにより、デフォルトで前方および後方へのシークが許可されます。

サンプル コードについては、スクリプト タスクの SSIS レコードセットに対する私の回答を参照してください。後続の行では使用できません

于 2013-10-26T17:20:19.980 に答える