具有输出列数的数据流组件,具体取决于输入参数。 SSIS自定义数据流组件

时间:2011-11-08 11:38:34

标签: c# ssis

我正在开发自定义数据流组件。我定义的一个自定义属性包含一个字符串,其中包含有关输出列数的信息,确切地说,它包含列的名称(可以是4,可以是5,但也可以是50)。

因此输出列的数量是可变的。我无法弄清楚如何(或者甚至可能)使一个具有多个输出列的组件根据输入而变化。

有没有人知道如何处理? 感谢

更新

确定。因此,在设计时,我会查看自定义属性并创建所需的列。我应该用哪种方法做这件事?

我在ProvideComponentProperties中尝试了这个:

    this.fields_ = this.ComponentMetaData.CustomPropertyCollection["Fields"].Value.ToString().Split(new Char[] { ',' });

    foreach (string _field in fields_)
    {
        IDTSOutputColumn100 _outputCol = ComponentMetaData.OutputCollection[0].OutputColumnCollection.New();
        _outputCol.Name = _field;
        _outputCol.SetDataTypeProperties(DataType.DT_STR, 20, 0, 0, 1252);
    }

基本上,fields_分割出一个类似这样的字符串:

PRVT_PLACE,OPT_IMPLIED_VOLATILITY_MID,OPT_IMPLIED_VOLATILITY_YEST

对于我想创建输出列的每个字段。

然后删除我的组件并设置fields_属性,但是我收到以下消息:

The name for "output column" "(93)" is blank and names cannot contain blanks.

只创建了一个空白名称的列,而不是上面示例中的4个...

我做错了什么?

3 个答案:

答案 0 :(得分:2)

SSIS要求在运行时不要更改元数据。这意味着您可以在设计时尽可能多地使用元数据,但是一旦执行包:源,目标(外部元数据:db,文件,...)和管道元数据无法更改。这是一种安全机制,可确保包装按预期完成工作。

当然,元数据中的更改只会导致警告。例如,oledb目标将注意到列数据类型从DT_I2更改为DT_I4(在SQL Server中为smallint - > int)但它将起作用。其他一些组件(如SQL Server目标)不允许对元数据进行任何更改。

总结:可以创建将在设计时更改输出列数的自定义组件,但无法在运行时更改列数或更改列类型。

答案 1 :(得分:1)

我终于找到了解决方案。这可能不是确切的事情,但它符合我的需要。

我覆盖了 OnOutputPathAttached 方法。在这个方法中,我查看我的fields_属性并根据它们的数量添加列。

ComponentMetaData.OutputCollection[0].OutputColumnCollection.RemoveAll();
string[] fields = this.ComponentMetaData.CustomPropertyCollection["Fields"].Value.ToString().Split(new Char[] { ',' });
foreach (string _field in fields)
{
     IDTSOutputColumn100 _outputCol = ComponentMetaData.OutputCollection[0].OutputColumnCollection.New();
     _outputCol.Name = _field;
     _outputCol.SetDataTypeProperties(DataType.DT_STR, 20, 0, 0, 1252);
}

base.OnOutputPathAttached(outputID);

答案 2 :(得分:0)

当然,你应该通过重写ReinitializeMetaData()来做到这一点。如果您支持不同数量的输出列(可能每个输出列都有不同的输出列),则只能执行OnOutputPathAttached。

我想。

请参阅http://technet.microsoft.com/en-us/library/ms135954.aspx

相关问题