使用指令碼元件建立 ODBC 目的地
適用於:SQL Server Azure Data Factory 中的 SSIS Integration Runtime
在 SQL Server Integration Services 中,您通常會使用 ADO.NET 目的地與 .NET Framework Data Provider for ODBC 來將資料儲存至 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 資料行。 在開發特定類型的指令碼元件主題中,這個相同的資料用於來源、轉換和目的地範例中。
設定此指令碼元件範例
建立 ODBC 連線管理員,以連線至 AdventureWorks 資料庫。
在 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(); } }