スクリプト コンポーネントによる ODBC 変換先の作成
SQL ServerIntegration Services では、通常、ADO.NET 変換先および .NET Framework Data Provider for ODBC を使用して、ODBC 変換先にデータを保存します。ただし、単一のパッケージで使用するアドホックな ODBC 変換先を作成することもできます。このアドホックな ODBC 変換先を作成するには、次の例に示すように、スクリプト コンポーネントを使用します。
注意 |
---|
複数のデータ フロー タスクおよび複数のパッケージでより簡単に再利用できるコンポーネントを作成する場合は、このスクリプト コンポーネント サンプルのコードを基にした、カスタム データ フロー コンポーネントの作成を検討してください。詳細については、「カスタム データ フロー コンポーネントの開発」を参照してください。 |
使用例
この例では、既存の ODBC 接続マネージャを使用して、データ フローのデータを MicrosoftSQL Server テーブルに保存する変換先コンポーネントの作成方法を示します。
この例は、「スクリプト コンポーネントによる変換先の作成」で示したカスタムの ADO.NET 変換先を変更したものです。ただし、この例のカスタムの ADO.NET 変換先は、ODBC 接続マネージャを使用してデータを ODBC 変換先に保存するように変更されています。こうした変更には、次の変更も含まれています。
マネージ コードから ODBC 接続マネージャの AcquireConnection メソッドを呼び出すことはできません。このメソッドを呼び出すと、ネイティブ オブジェクトが返されます。そのため、この例では、接続マネージャの接続文字列を使用して、マネージ ODBC .NET Framework データ プロバイダで直接データ ソースに接続しています。
OdbcCommand には、位置パラメータが必要です。パラメータの位置は、コマンドのテキストの疑問符 (?) で示されます (一方、SqlCommand では名前付きパラメータが必要です)。
この例では、AdventureWorks サンプル データベースの Person.Address テーブルを使用します。この例では、このテーブルの第 1 列と第 4 列、つまり 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 などのわかりやすい名前に変更します。
[接続マネージャ] ページで、ODBC 接続マネージャを追加または作成し、MyODBCConnectionManager などのわかりやすい名前を付けます。
[スクリプト] ページで、[スクリプトの編集] をクリックし、以下に示すスクリプトを 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(); } }
|