如何以编程方式在SSIS中使用“来自变量枚举器的Foreach”创建一个foreach循环

时间:2018-07-04 03:21:54

标签: ssis biml

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

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

我在forEachLoop.ForEachEnumerator中找不到任何选项。我也无法将forEachEnumeratorHost.InnerObject强制转换为所需的枚举数。我在MSDN上发现了一个类Microsoft.SqlServer.Dts.Runtime.Enumerators.FromVar.ForEachFromVarEnumerator。但是我无法在枚举器中找到FromVar类。我想念严重的东西吗?

还有其他人这样做吗?我发现很难相信通过Visual Studio UI可以轻松完成的某些事情不能以编程方式完成。

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

  

ForEachLoop forEachLoop = p.Executables.Add(“ STOCK:FOREACHLOOP”)为   ForEachLoop;

     

//创建一个VariableMappings和VariableMapping对象。
    ForEachVariableMapping forEachVariableMapping =   forEachLoop.VariableMappings.Add();

     

//在变量及其值之间创建映射。
    forEachVariableMapping.VariableName = @“ User :: CurrentTableName”;     forEachVariableMapping.ValueIndex = 0;

     

ForEachEnumeratorInfo forEachEnumeratorInfo =   runtimeApp.ForEachEnumeratorInfos [“从变量枚举器中获取”];     ForEachEnumeratorHost forEachEnumeratorHost =   forEachEnumeratorInfo.CreateNew();

3 个答案:

答案 0 :(得分:2)

您快要出现了...我认为您忘记了设置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

答案 1 :(得分:1)

第一步是 将程序集引用添加到Microsoft.SqlServer.ForEachFromVarEnumerator.dll,然后可以访问Microsoft.SqlServer.Dts.Runtime.Enumerators.FromVar.ForEachFromVarEnumerator类。

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

答案 2 :(得分:0)

您可以这样做:

脚本任务

确保MyList变量可写

  ArrayList NewList = new ArrayList();

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

enter image description here