2

助けが必要です。最近、クライアント用のパッケージを開発しているときにこの問題に遭遇しました。SQl タスクの結果セットをユーザー変数 (オブジェクト) に保存してから、さまざまなスクリプト タスクでアクセスしようとしています。変数のスコープはパッケージ レベルに設定されます。以下のコードを使用すると、 S.Container の Script タスクで値を取得できますが、 S.Container2 の Script タスクで同じコードを使用すると、取得できません。後者では、「dt」はデータではなくヘッダーのみを表示します。

この特定の動作の理由は? 何が足りないのですか?

SQL タスク コード -----------

select * from dimproduct

スクリプト タスク コード -----------

 DataTable dt = new DataTable();
 DataRow row = null;
 OleDbDataAdapter oleDA = new OleDbDataAdapter();
 oleDA.Fill(dt, Dts.Variables["Variable"].Value);
    foreach (DataRow row_ in dt.Rows)
     {
       row = row_;
     }

ここに画像の説明を入力

EDIT :: 次のコードも機能しません。

Variables lockedVariables = null;
            Dts.VariableDispenser.LockForWrite("User::Variable");
            Dts.VariableDispenser.GetVariables( ref lockedVariables);
            object A;
             A= lockedVariables["User::Variable"].Value;
            lockedVariables.Unlock();
            DataTable dt = new DataTable();
            DataRow row = null;
            OleDbDataAdapter oleDA = new OleDbDataAdapter();
            oleDA.Fill(dt, A);
            foreach (DataRow row_ in dt.Rows)
            {
                row = row_;

            }
4

2 に答える 2

0

パッケージのスコープで 1 回、最初のシーケンス コンテナーのスコープで 1 回、変数を誤って 2 回宣言していませんか?

編集:これが示すように、Fill を呼び出すと、ソースの結果がクリアされるようです。

    DataTable dt1 = new DataTable();
    OleDbDataAdapter oleDA = new OleDbDataAdapter();
    oleDA.Fill(dt1, Dts.Variables["Results"].Value);
    foreach (DataRow row_ in dt1.Rows)
    {
        MessageBox.Show(row_[0].ToString());
    }

    //Try and fill with the same data adapter
    DataTable dt2 = new DataTable();
    oleDA.Fill(dt2, Dts.Variables["Results"].Value); 
    foreach (DataRow row_ in dt2.Rows)
    {
        //This will never be hit
        MessageBox.Show(row_[0].ToString());
    }   
于 2013-08-12T16:43:28.397 に答える