1

C# から始めた SSIS パッケージのコードに変数を設定しようとしています。

Package pkg = app.LoadPackage(ConfigurationManager.AppSettings["SsisPkg"].ToString(), null);
pkg.Variables["User::FolderPath"].Value = Path.GetDirectoryName(e.FullPath);
pkg.Variables["User::FileName"].Value = Path.GetFileNameWithoutExtension(e.FullPath);

デバッグ中に、値を設定した直後に値を調べましたが、何も変更されていません。値を掘り下げることができるので(ホバー、ナビゲート、値の編集)、編集できないようには見えません。

ここで私が間違っていることはありますか?

更新: billinkc のおかげで、おそらく他の条件が満たされている限り、私がやっていることはうまくいくはずです。コードでの直接割り当てが失敗し (エラーは発生せず、単に "取得" しないでください)、ウォッチ ウィンドウで値を編集できないことがわかりました。値を調べているときに値を編集できます

実際の問題は、これらに読み取り専用のフラグを立てる設定があることでしょうか?

回答が見つかりました: 値を設定する前に変数を書き込み可能にする必要がありました:

        pkg.Variables["User::FileName"].EvaluateAsExpression = false;
4

1 に答える 1

1

あなたはそれを正しくやっています。基本的な SSIS パッケージを作成しました。1 つの変数、FolderPath、タイプ文字列があります。Information イベントを発生させるスクリプト タスクが 1 つあり、その内容によって FolderPath 変数の値が公開されます。

ここに画像の説明を入力

次に、このような基本的な C# コンソール アプリを作成しました

public class InformationListener : DefaultEvents
{
    public override void OnInformation(DtsObject source, int informationCode, string subComponent, string description, string helpFile, int helpContext, string idofInterfaceWithError, ref bool fireAgain)
    {
        //base.OnInformation(source, informationCode, subComponent, description, helpFile, helpContext, idofInterfaceWithError, ref fireAgain);
        Console.WriteLine(string.Format("{0} {1}", subComponent, description));
    }

}

class Program
{
    static void Main(string[] args)
    {
        string sourcePackage = string.Empty;
        string path = string.Empty;
        string variableName = string.Empty;
        string designValue = string.Empty;
        string newValue = string.Empty;
        InformationListener listener = null;

        sourcePackage = @"J:\Src\SO\SSIS\Package.dtsx";
        path = @"J:\runtime";
        variableName = "User::FolderPath";
        listener = new InformationListener();

        Application app = new Application();
        Package pkg = null;
        Variable ssisVariable = null;
        pkg = app.LoadPackage(sourcePackage, null);

        ssisVariable = pkg.Variables[variableName];
        designValue = ssisVariable.Value.ToString();

        Console.WriteLine(string.Format("Designtime value = {0}", designValue));

        ssisVariable.Value = path;

        newValue = ssisVariable.Value.ToString();
        Console.WriteLine(string.Format("new value = {0}", newValue));

        DTSExecResult results = DTSExecResult.Canceled;

        results = pkg.Execute(null, null, listener, null, null);

        Console.WriteLine("Press any key to continue");
        Console.ReadKey();

    }
}

変数検査からわかるように

ここに画像の説明を入力

そして私のプリントステートメントから

ここに画像の説明を入力

上記の文字列をエスケープするのを忘れたため、 の設計時の値はC:\designTimeに移動しますが、表示されるふりをすることができます。J:J:\runtime

つまり、メソッドを呼び出してパッケージをシリアル化しない限りSaveToXml、オブジェクトがスコープ外になると、User::FolderPath の値は設計時の値にリセットされます。永久に更新すると次のようになります

app.SaveToXml(sourcePackage, pkg, null);

OP EDITこの議論と例は、私を答えに導きました : c-script-task-not-setting-variable

于 2013-10-03T02:05:29.787 に答える