使用脚本组件创建 ODBC 目标
适用范围:SQL Server Azure 数据工厂中的 SSIS Integration Runtime
在 SQL Server Integration Services 中,通常使用 ADO.NET 目标和用于 ODBC 的 .NET Framework 数据提供程序将数据保存到 ODBC 目标。 当然,还可以创建供单个包使用的即席 ODBC 目标。 若要创建此即席 ODBC 目标,可使用脚本组件,如下面的示例中所示。
注意
如果希望创建可更方便地重用于多个数据流任务和多个包的组件,请考虑以此脚本组件示例中的代码为基础,创建自定义数据流组件。 有关详细信息,请参阅 开发自定义数据流组件。
示例
下面的示例演示如何创建一个目标组件,该组件使用现有 ODBC 连接管理器将数据流中的数据保存到 Microsoft SQL Server 表。
本示例是使用脚本组件创建目标主题中演示的自定义 ADO.NET 目标的修改版本。 但是,在此示例中,自定义 ADO.NET 目标已修改为使用 ODBC 连接管理器并将数据保存到 ODBC 目标。 此外,还包括以下更改:
不能从托管代码调用 ODBC 连接管理器的 AcquireConnection 方法,因为它返回的是一个本机对象。 因此,本示例使用连接管理器的连接字符串通过托管 ODBC .NET Framework 数据访问接口直接连接到数据源。
OdbcCommand 需要位置参数。 在命令的文本中,参数的位置由问号 (?) 指示。 (相反,SqlCommand 需要命名参数。)
本示例使用 AdventureWorks 示例数据库中的 Person.Address 表。 此示例通过数据流传递此表的第一列和第四列:int AddressID 和 nvarchar(30) City 列。 开发特定类型的脚本组件主题中的源、转换和目标示例使用了相同的数据。
配置此脚本组件示例
创建连接 AdventureWorks 数据库的 ODBC 连接管理器。
通过在 AdventureWorks 数据库中运行以下 Transact-SQL 命令来创建一个目标表:
CREATE TABLE [Person].[Address2]([AddressID] [int] NOT NULL, [City] [nvarchar](30) NOT NULL)
向数据流设计器图面添加新的脚本组件并将其配置为目标。
在 SSIS 设计器中将上游源或转换的输出连接到目标组件。 (无需任何转换,即可将源直接连接到目标。)为了确保本示例能够正常工作,上游组件的输出必须至少包含 AdventureWorks 示例数据库的 Person.Address 表中的 AddressID 和 City 列。
打开“脚本转换编辑器” 。 在“输入列” 页中,选择 AddressID 和 City 列。
在“输入和输出”页中,用更具说明性的名称(如 MyAddressInput)重命名输入。
在“连接管理器”页中,添加或创建一个具有说明性名称(如 MyODBCConnectionManager)的 ODBC 连接管理器。
在“脚本”页中,单击“编辑脚本”,并在 ScriptMain 类中输入下面所示的脚本。
关闭脚本开发环境和“脚本转换编辑器”,然后运行该示例。
Imports System.Data.Odbc ... Public Class ScriptMain Inherits UserComponent Dim odbcConn As OdbcConnection Dim odbcCmd As OdbcCommand Dim odbcParam As OdbcParameter Public Overrides Sub AcquireConnections(ByVal Transaction As Object) Dim connectionString As String connectionString = Me.Connections.MyODBCConnectionManager.ConnectionString odbcConn = New OdbcConnection(connectionString) odbcConn.Open() End Sub Public Overrides Sub PreExecute() odbcCmd = New OdbcCommand("INSERT INTO Person.Address2(AddressID, City) " & _ "VALUES(?, ?)", odbcConn) odbcParam = New OdbcParameter("@addressid", OdbcType.Int) odbcCmd.Parameters.Add(odbcParam) odbcParam = New OdbcParameter("@city", OdbcType.NVarChar, 30) odbcCmd.Parameters.Add(odbcParam) End Sub Public Overrides Sub MyAddressInput_ProcessInputRow(ByVal Row As MyAddressInputBuffer) With odbcCmd .Parameters("@addressid").Value = Row.AddressID .Parameters("@city").Value = Row.City .ExecuteNonQuery() End With End Sub Public Overrides Sub ReleaseConnections() odbcConn.Close() End Sub End Class
using System.Data.Odbc; ... public class ScriptMain : UserComponent { OdbcConnection odbcConn; OdbcCommand odbcCmd; OdbcParameter odbcParam; public override void AcquireConnections(object Transaction) { string connectionString; connectionString = this.Connections.MyODBCConnectionManager.ConnectionString; odbcConn = new OdbcConnection(connectionString); odbcConn.Open(); } public override void PreExecute() { odbcCmd = new OdbcCommand("INSERT INTO Person.Address2(AddressID, City) " + "VALUES(?, ?)", odbcConn); odbcParam = new OdbcParameter("@addressid", OdbcType.Int); odbcCmd.Parameters.Add(odbcParam); odbcParam = new OdbcParameter("@city", OdbcType.NVarChar, 30); odbcCmd.Parameters.Add(odbcParam); } public override void MyAddressInput_ProcessInputRow(MyAddressInputBuffer Row) { { odbcCmd.Parameters["@addressid"].Value = Row.AddressID; odbcCmd.Parameters["@city"].Value = Row.City; odbcCmd.ExecuteNonQuery(); } } public override void ReleaseConnections() { odbcConn.Close(); } }