比较脚本任务和脚本组件

脚本任务在 Integration Services 设计器的“控制流”窗口中,脚本组件在“数据流”窗口中,它们在 Integration Services 包中的用途非常不同。 任务是一般用途的控制流工具,而组件用作数据流中的源、转换或目标。 尽管它们的用途不同,但是脚本任务和脚本组件在所使用的编码工具和在包中供开发人员使用的对象方面还是有一些相似之处的。 了解它们的相似与不同之处有助于您更有效地使用任务和组件。

脚本任务和脚本组件之间的相似之处

脚本任务和脚本组件有以下相同特性。

功能 说明
两个设计时模式 在任务和组件中,都是从在编辑器中指定属性开始,然后切换到开发环境编写代码。
Microsoft Visual Studio Tools for Applications (VSTA) 任务和组件都使用相同的 VSTA IDE,并且支持在 Microsoft Visual Basic 或 Microsoft Visual C# 中编写代码。
预编译的脚本 从 SQL Server 2008 Integration Services (SSIS) 开始,所有脚本都要进行预编译。 在早期版本中,您可以指定是否对脚本进行预编译。

脚本被预编译为二进制代码会使执行更加快速,但代价是会增加包大小。
调试 任务和组件都支持在设计环境中进行调试时设置断点和单步执行代码。 有关详细信息,请参阅 编写和调试脚本任务 和 [脚本组件编码和调试] (。/extensions-packages-scripting/data-flow-script-component/coding-and-debugging-the-script-component.md。

脚本任务和脚本组件之间的不同之处

脚本任务和脚本组件有以下值得注意的不同之处。

功能 脚本任务 脚本组件
控制流/数据流 脚本任务在设计器的“控制流”选项卡中配置,在包的数据流外部运行。 脚本组件在设计器的“数据流”页中配置,表示数据流任务中的源、转换或目标。
目的 脚本任务可完成几乎所有一般用途的任务。 必须指定是否要使用脚本组件创建源、转换或目标。
执行 脚本任务在包工作流中的某个点运行自定义代码。 除非将其放在循环容器或事件处理程序中,否则它只运行一次。 脚本组件也运行一次,但是通常它为数据流中的每行数据运行一次主处理例程。
编辑器 “脚本任务编辑器”有三个页面:“常规”、“脚本”和“表达式”ReadOnlyVariables只有 和 ReadWriteVariablesScriptLanguage 属性会直接影响可以编写的代码。 “脚本转换编辑器”最多有四个页面:“输入列”、“输入和输出”、“脚本”和“连接管理器”。 在其中每个页面上配置的元数据和属性将决定自动生成以供您在编码中使用的基类的成员。
与包交互 在为脚本任务编写的代码中,使用 Dts 属性访问包的其他功能。 Dts 属性是 ScriptMain 类的成员。 在脚本组件代码中,使用类型化的取值函数属性访问特定包功能,如变量和连接管理器。

PreExecute 方法仅可访问只读变量。 PostExecute 方法既可以访问只读变量,又可以访问读/写变量。

有关这些方法的详细信息,请参阅 [脚本组件编码和调试] (。/extensions-packages-scripting/data-flow-script-component/coding-and-debugging-the-script-component.md。
使用变量 脚本任务使用 Variables 对象的 属性 Dts 来访问通过任务的 ReadOnlyVariablesReadWriteVariables 属性提供的变量。 例如:

[VB]

Dim myVar as String myVar = Dts.Variables("MyStringVariable").Value.ToString



[C#]

string myVar; myVar = Dts.Variables["MyStringVariable"].Value.ToString();
脚本组件使用自动生成的基类的类型化取值函数属性,这些属性基于组件的 ReadOnlyVariablesReadWriteVariables 属性创建。 例如:

[VB]

Dim myVar as String myVar = Me.Variables.MyStringVariable



[C#]

string myVar; myVar = this.Variables.MyStringVariable;
使用连接 脚本任务使用 Dts 对象的 Connections 属性访问在包中定义的连接管理器。 例如:

[VB]

Dim myFlatFileConnection As String myFlatFileConnection = _ DirectCast(Dts.Connections("Test Flat File Connection").AcquireConnection(Dts.Transaction), _ String)



[C#]

string myFlatFileConnection; myFlatFileConnection = (Dts.Connections["Test Flat File Connection"].AcquireConnection(Dts.Transaction) as String);
脚本组件使用自动生成的基类的类型化取值函数属性,这些属性基于用户在编辑器的“连接管理器”页上输入的连接管理器列表创建。 例如:

[VB]

Dim connMgr As IDTSConnectionManager100 connMgr = Me.Connections.MyADONETConnection



[C#]

IDTSConnectionManager100 connMgr; connMgr = this.Connections.MyADONETConnection;
引发事件 脚本任务使用 Dts 对象的 Events 属性引发事件。 例如:

[VB]

Dts.Events.FireError(0, "Event Snippet", _ ex.Message & ControlChars.CrLf & ex.StackTrace, _ "", 0)



[C#]

Dts.Events.FireError(0, "Event Snippet", ex.Message + "\r" + ex.StackTrace, "", 0);
脚本组件使用 IDTSComponentMetaData100 属性返回的 ComponentMetaData 接口的方法引发错误、警告和信息性消息。 例如:

[VB]

Dim myMetadata as IDTSComponentMetaData100 myMetaData = Me.ComponentMetaData myMetaData.FireError(...)
Logging 脚本任务使用 Log 对象的 方法 Dts 将信息记录到已启用的日志提供程序。 例如:

[VB]

Dim bt(0) As Byte Dts.Log("Test Log Event", _ 0, _ bt)



[C#]

byte[] bt = new byte[0]; Dts.Log("Test Log Event", 0, bt);
脚本组件使用自动生成的基类的 Log 方法将信息记录到已启用的日志提供程序。 例如:

[VB]

Dim bt(0) As Byte

Me.Log("Test Log Event", _

0, _

bt)



[C#]

byte[] bt = new byte[0]; this.Log("Test Log Event", 0, bt);
返回结果 脚本任务使用 TaskResult 对象的 属性和可选 ExecutionValue 属性 Dts 来通知运行时其结果。 脚本组件作为数据流任务的组成部分运行,不会使用这两个属性中的任何一个报告结果。

另请参阅

使用脚本任务扩展包
使用脚本组件扩展数据流
使用 SQL Server Integration Services SSIS 中的脚本任务连接到 Web 服务