比较脚本任务和脚本组件

Integration Services 设计器的“控制流”窗口中提供的脚本任务以及数据流窗口中提供的脚本组件在 Integration Services 包中具有截然不同的目的。 任务是常规用途的控制流工具,而组件充当数据流中的源、转换或目标。 但是,尽管脚本任务和脚本组件具有不同的用途,但它们使用的编码工具及其提供给开发人员的包中的对象具有一些相似之处。 了解它们的相似性和差异可能有助于更有效地使用任务和组件。

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

脚本任务和脚本组件共享以下常见功能。

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

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

脚本任务与脚本组件之间的差异

脚本任务和脚本组件具有以下值得注意的差异。

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

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

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

[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;
使用连接 脚本任务使用 Connections 对象的属性 Dts 访问包中定义的连接管理器。 例如:

[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;
引发事件 脚本任务使用 Events 对象的属性 Dts 引发事件。 例如:

[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);
脚本组件使用属性返回ComponentMetaDataIDTSComponentMetaData100接口的方法引发错误、警告和信息性消息。 例如:

[VB]

Dim myMetadata as IDTSComponentMetaData100 myMetaData = Me.ComponentMetaData myMetaData.FireError(...)
伐木业 脚本任务使用 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 服务