我正在开发自定义数据流组件。我定义的一个自定义属性包含一个字符串,其中包含有关输出列数的信息,确切地说,它包含列的名称(可以是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个...
我做错了什么?
答案 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。
我想。