数据流组件的设计时方法
在执行前,称数据流任务处于设计时状态,因为它将接受增量更改。这些更改可以包括添加或删除组件、添加或删除连接组件的路径对象以及更改组件的元数据。出现元数据更改时,组件可监视这些更改并对这些更改作出响应。例如,组件可以禁止某些更改或为响应某一更改而进行其他更改。在设计时,设计器通过设计时 IDTSDesigntimeComponent100 接口与组件进行交互。
设计时实现
组件的设计时接口通过 IDTSDesigntimeComponent100 接口描述。虽然您不显式实现此接口,但熟悉此接口中定义的方法将有助于您了解 PipelineComponent 基类的哪些方法与组件的设计时实例相对应。
组件加载到 Business Intelligence Development Studio 后,组件的设计时实例将会被实例化,并会在编辑组件时调用 IDTSDesigntimeComponent100 接口的方法。基类的实现使您可以只重写您组件需要的方法。在很多情况下,您可以重写这些方法,以阻止不当的组件编辑。例如,若要阻止用户向组件中添加输出,可重写 InsertOutput 方法。否则,当基类调用此方法的实现时,它会向组件中添加一个输出。
无论组件的用途或功能是什么,您都应重写 ProvideComponentProperties、Validate 和 ReinitializeMetaData 方法。有关 Validate 和 ReinitializeMetaData 的详细信息,请参阅验证数据流组件。
ProvideComponentProperties 方法
组件的初始化在 ProvideComponentProperties 方法中进行。此方法在组件添加到数据流任务时由 SSIS 设计器调用,它类似于一个类构造函数。组件开发人员应该在此方法调用期间创建并初始化该方法的输入、输出和自定义属性。ProvideComponentProperties 方法不同于构造函数,因为并不是每次实例化组件的设计时实例或运行时实例时都会调用此方法。
方法的基类实现向组件中添加输入和输出,并向 SynchronousInputID 属性分配输入的 ID。但是,在 SQL Server 中,未命名基类添加的输入和输出对象。包含具有输入或输出对象的包(其 Name 属性未设置)将不会成功加载。因此,在您使用基类实现时,必须将值显式分配给默认输入和输出的 Name 属性。
public override void ProvideComponentProperties()
{
/// TODO: Reset the component.
/// TODO: Add custom properties.
/// TODO: Add input objects.
/// TODO: Add output objects.
}
Public Overrides Sub ProvideComponentProperties()
' TODO: Reset the component.
' TODO: Add custom properties.
' TODO: Add input objects.
' TODO: Add output objects.
End Sub
创建自定义属性
在对 ProvideComponentProperties 方法的调用中,组件开发人员应该向组件添加自定义属性 (IDTSCustomProperty100)。自定义属性没有数据类型属性。自定义属性的数据类型由值的数据类型设置,您已将该数据类型分配给其 Value 属性。但是,在向自定义属性分配初始值后,不能分配具有其他数据类型的值。
注意 |
---|
IDTSCustomProperty100 接口提供对 Object 类型的属性值的有限支持。能够作为自定义属性值存储的唯一对象是简单类型数组,如字符串或整数。 |
可指示自定义属性支持属性表达式,方法是从 DTSCustomPropertyExpressionType 枚举将其 ExpressionType 属性的值设置为 CPET_NOTIFY,如下列示例中所示。不必添加用于处理或验证用户输入的属性表达式的任何代码。可以设置属性的默认值、验证该值并正常读取和使用该值。
IDTSCustomProperty100 myCustomProperty;
...
myCustomProperty.ExpressionType = DTSCustomPropertyExpressionType.CPET_NOTIFY;
Dim myCustomProperty As IDTSCustomProperty100
...
myCustomProperty.ExpressionType = DTSCustomPropertyExpressionType.CPET_NOTIFY
如以下示例中所示,可使用 TypeConverter 属性来限制用户对枚举的自定义属性值的选择,该属性假设已定义了名为 MyValidValues 的公共枚举。
IDTSCustomProperty100 customProperty = outputColumn.CustomPropertyCollection.New();
customProperty.Name = "My Custom Property";
// This line associates the type with the custom property.
customProperty.TypeConverter = typeof(MyValidValues).AssemblyQualifiedName;
// Now you can use the enumeration values directly.
customProperty.Value = MyValidValues.ValueOne;
Dim customProperty As IDTSCustomProperty100 = outputColumn.CustomPropertyCollection.New
customProperty.Name = "My Custom Property"
' This line associates the type with the custom property.
customProperty.TypeConverter = GetType(MyValidValues).AssemblyQualifiedName
' Now you can use the enumeration values directly.
customProperty.Value = MyValidValues.ValueOne
有关详细信息,请参阅 MSDN Library 中的“Generalized Type Conversion”(通用类型转换)和“Implementing a Type Converter”(实现类型转换器)。
可使用 UITypeEditor 属性指定自定义属性的值的自定义编辑器对话框,如下列示例中所示。首先,如果无法找到能够满足您需要的现有 UI 类型编辑器,则必须创建从 System.Drawing.Design.UITypeEditor 继承的自定义属性编辑器。
public class MyCustomTypeEditor : UITypeEditor
{
...
}
Public Class MyCustomTypeEditor
Inherits UITypeEditor
...
End Class
然后,指定此类作为自定义属性的 UITypeEditor 属性的值。
IDTSCustomProperty100 customProperty = outputColumn.CustomPropertyCollection.New();
customProperty.Name = "My Custom Property";
// This line associates the editor with the custom property.
customProperty.UITypeEditor = typeof(MyCustomTypeEditor).AssemblyQualifiedName;
Dim customProperty As IDTSCustomProperty100 = outputColumn.CustomPropertyCollection.New
customProperty.Name = "My Custom Property"
' This line associates the editor with the custom property.
customProperty.UITypeEditor = GetType(MyCustomTypeEditor).AssemblyQualifiedName
有关详细信息,请参阅 MSDN Library 中的“Implementing a UI Type Editor”(实现 UI 类型编辑器)。
|