2011-11-08 33 views
0

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

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

有没有人有如何处理的想法? 感谢

UPDATE

确定。所以在设计时我会查看我的自定义属性并创建所需的列。我应该在哪种方法中做到这一点?

我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,而不是

我做错了什么?

回答

0

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

我推翻了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

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

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

摘要:可以创建自定义组件,它将在设计时更改输出列的数量,但不可能在运行时更改列数或更改列类型。

+0

好吧,我已经编辑我的问题表现出什么,我在设计时ATM unsucessfully尝试。谢谢你的帮助 – nche

相关问题