使用指令碼元件建立 ODBC 目的地
在 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 目的地。 這些修改也包括下列變更:
您無法從 Managed 程式代碼呼叫
AcquireConnection
ODBC 連接管理員的 方法,因為它會傳回原生物件。 因此,這個範例使用連線管理員的連接字串以將受控 ODBC .NET Framework 資料提供者直接連線至資料來源。預期
OdbcCommand
位置參數。 參數的位置由命令文字中的問號 (?) 指出 (相反地,預期SqlCommand
有具名參數。
此範例使用 AdventureWorks 範例資料庫中的 Person.Address 資料表。 此範例會透過數據流傳遞此數據表的第一個和第四個數據 行 intAddressID 和 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(); } }
使用 Integration Services 保持最新狀態
如需來自Microsoft的最新下載、文章、範例和影片,以及來自社群的所選解決方案,請流覽 MSDN 上的 Integration Services 頁面:
流覽 MSDN 上的 Integration Services 頁面
如需這些更新的自動通知,請訂閱頁面上可用的 RSS 摘要。