如何以编程方式在 SSIS 中使用 "Foreach From Variable Enumerator" 创建 foreach 循环

How can I create a foreach loop with "Foreach From Variable Enumerator" in SSIS programmatically

我正在尝试使用 DTS 运行时 classes 动态创建 SSIS 包。 我正在尝试使用 "Foreach From Variable Enumerator" 创建一个 foreach 循环,其中我的变量包含一个具有必要集合的 ArrayList。

我无法找到一种方法来设置变量(在枚举器配置下,如在 VS 中所见),该变量将保存要循环的集合。

我在 forEachLoop.ForEachEnumerator 中找不到任何选项。我也无法将 forEachEnumeratorHost.InnerObject 转换为我想要的枚举器。我在 MSDN 上找到了一个 class Microsoft.SqlServer.Dts.Runtime.Enumerators.FromVar.ForEachFromVarEnumerator。但是我无法在 Enumerators 中找到 FromVar class。我是不是漏掉了什么严重的东西?

有没有人这样做过?我很难相信可以通过 Visual Studio UI 轻松完成的事情不能通过编程方式完成。

下面是我现在的代码...

ForEachLoop forEachLoop = p.Executables.Add("STOCK:FOREACHLOOP") as ForEachLoop;

// Create a VariableMappings and VariableMapping objects.
ForEachVariableMapping forEachVariableMapping = forEachLoop.VariableMappings.Add();

// Create a mapping between the variable and its value.
forEachVariableMapping.VariableName = @"User::CurrentTableName"; forEachVariableMapping.ValueIndex = 0;

ForEachEnumeratorInfo forEachEnumeratorInfo = runtimeApp.ForEachEnumeratorInfos["Foreach From Variable Enumerator"]; ForEachEnumeratorHost forEachEnumeratorHost = forEachEnumeratorInfo.CreateNew();

你可以这样做:

脚本任务

确保 MyList 变量是可写的

  ArrayList NewList = new ArrayList();

            NewList.Add("Ost");
            NewList.Add("Hest");
            Dts.Variables["User::MyList"].Value = NewList;
            Dts.TaskResult = (int)ScriptResults.Success;

你快完成了...我想你忘记设置 forEachLoop 对象的 ForEachEnumerator 属性。

ForEachLoop forEachLoop = p.Executables.Add("STOCK:FOREACHLOOP") as ForEachLoop;
ForEachEnumeratorInfo forEachEnumeratorInfo = runtimeApp.ForEachEnumeratorInfos["Foreach From Variable Enumerator"]; 
ForEachEnumeratorHost forEachEnumeratorHost = forEachEnumeratorInfo.CreateNew();
//forEachEnumeratorHost.CollectionEnumerator = false; // true or false; set accordingly.

// cast the inner object to ForEachFromVarEnumerator
ForEachFromVarEnumerator = forEachEnumeratorHost.InnerObject as ForEachFromVarEnumerator;

// Now that you have the ForEachFromVarEnumerator, set its properties.
// For variable name, do not forget the variable's name space and the variable name (separated by ::)
ForEachFromVarEnumerator.VariableName = "var_namespace" + "::" + "var_name";

// finally.....
forEachLoop.ForEachEnumerator = forEachEnumeratorHost; // DO NOT FORGET THIS. Here you are setting what the actual enumerator would be

第一步是 添加对 Microsoft.SqlServer.ForEachFromVarEnumerator.dll 的程序集引用,然后可以访问 Microsoft.SqlServer.Dts.Runtime.Enumerators.FromVar.ForEachFromVarEnumerator class.

然后剩下的答案正是@Sam 上面提到的。