スクリプト コンポーネントによる変換先の作成
更新 : 2006 年 7 月 17 日
Integration Services パッケージのデータ フロー内では、変換先コンポーネントを使用して、上流の変換元や変換から受け取ったデータをデータ ソースに保存します。通常、変換先コンポーネントをデータ ソースに接続するには、既存の接続マネージャを使用します。
スクリプト コンポーネントの概要については、「スクリプト コンポーネントによるデータ フローの拡張」を参照してください。
スクリプト コンポーネントおよびそれによって生成されるインフラストラクチャ コードを活用すれば、カスタム データ フロー コンポーネントを開発するための手順を大幅に簡略化できます。ただし、スクリプト コンポーネントの動作のしくみを理解するため、「カスタム データ フロー コンポーネントの開発」のセクション、特に「カスタム変換先コンポーネントの開発」を参照して、カスタム データ フロー コンポーネントの開発手順に目を通しておくと役に立ちます。
変換先コンポーネントの概要
SSIS デザイナの [データ フロー] タブにスクリプト コンポーネントを追加すると、[スクリプト コンポーネントの種類を選択] ダイアログ ボックスが開き、[変換元]、[変換先]、または [変換] スクリプトのいずれかを選択するように求められます。このダイアログ ボックスで、[変換先] を選択します。
次に、SSIS デザイナで、変換の出力を変換先コンポーネントに接続します。テスト目的の場合、変換を介さずに変換元を直接変換先に接続することもできます。
メタデータ デザイン モードでの変換先コンポーネントの構成
変換先コンポーネントを作成するオプションを選択したら、[スクリプト変換エディタ] を使用して、コンポーネントを構成します。詳細については、「スクリプト コンポーネント エディタでのスクリプト コンポーネントの構成」を参照してください。
データ フローの変換先コンポーネントには、1 つの入力があり、出力はありません。コンポーネントの入力の設定は、メタデータ デザイン モードでカスタム スクリプトを記述する前に完了する必要のある作業の 1 つです。これを行うには、[スクリプト変換エディタ] を使用します。
接続マネージャの追加
通常、変換先コンポーネントは既存の接続マネージャを使用してデータ ソースに接続し、データ フローからのデータを保存します。[スクリプト変換エディタ] の [接続マネージャ] ページで [追加] をクリックして、適切な接続マネージャを追加します。
ただし、接続マネージャは、便宜上、特定の種類のデータ ソースに接続するために必要な情報をカプセル化して格納するユニットにすぎません。データの読み込みや保存、場合によってはデータ ソースとの接続や切断を行うためには、独自のカスタム コードを記述する必要があります。
スクリプト コンポーネントでの接続マネージャの使用方法に関する一般情報については、「スクリプト コンポーネントでのデータ ソースへの接続」を参照してください。
[スクリプト変換エディタ] の [接続マネージャ] ページの詳細については、「[スクリプト変換エディタ] ([接続マネージャ] ページ)」を参照してください。
入力および入力列の設定
変換先コンポーネントには、1 つの入力があり、出力はありません。
[スクリプト変換エディタ] の [入力列] ページには、データ フローの上流に位置するコンポーネントの出力で使用可能な列が一覧表示されます。保存する列を選択します。
[スクリプト変換エディタ] の [入力列] ページの詳細については、「[スクリプト変換エディタ] ([入力列] ページ)」を参照してください。
[スクリプト変換エディタ] の [入力および出力] ページには入力が 1 つ表示されています。この入力の名前は変更できます。スクリプト内ではこの名前で入力を参照しますが、参照には自動生成されたコードによって作成されたアクセサ プロパティが使用されます。
[スクリプト変換エディタ] の [入力および出力] ページの詳細については、「[スクリプト変換エディタ] ([入力および出力] ページ)」を参照してください。
変数の追加
既存の変数の値をスクリプト内で使用する場合、[スクリプト変換エディタ] の [スクリプト] ページで、ReadOnlyVariables プロパティおよび ReadWriteVariables プロパティのフィールドに追加できます。複数の変数を追加する場合は、変数名をコンマで区切ります。
スクリプト コンポーネントで変数を使用する方法に関する一般情報については、「スクリプト コンポーネントでの変数の使用」を参照してください。
[スクリプト変換エディタ] の [スクリプト] ページの詳細については、「[スクリプト変換エディタ] ([スクリプト] ページ)」を参照してください。
コード デザイン モードでの変換先コンポーネントのスクリプト作成
コンポーネントのメタデータを設定したら、Visual Studio for Applications (VSA) IDE を開き、Visual Basic .NET 言語を使用してカスタム スクリプトのコードを作成します。VSA IDE を開くには、[スクリプト変換エディタ] の [スクリプト] ページで、[スクリプトのデザイン] をクリックします。
スクリプト コンポーネントを使用して作成するすべての種類のコンポーネントに関する重要情報については、「スクリプト コンポーネントのコーディングおよびデバッグ」を参照してください。
自動生成されたコードについて
変換先コンポーネントを作成、設定した後で VSA IDE を開くと、コード エディタには ScriptMain クラスが編集可能な状態で表示されます。また、ProcessInputRow メソッドがスタブとして表示されます。カスタム コードは ScriptMain クラスに記述します。また、ProcessInputRow は変換先コンポーネントの最重要メソッドです。
VSA の [プロジェクト エクスプローラ] ウィンドウを開くと、スクリプト コンポーネントにより、BufferWrapper および ComponentWrapper というプロジェクト アイテムが、読み取り専用の状態で自動生成されていることもわかります。ScriptMain クラスは、ComponentWrapper プロジェクト アイテム内の UserComponent クラスを継承します。
実行時には、データ フロー エンジンが UserComponent クラスの ProcessInput メソッドを呼び出します。これは親クラスである ScriptComponent の ProcessInput メソッドをオーバーライドします。ProcessInput メソッドは、入力バッファに格納された行を順にループし、各行で 1 回ずつ ProcessInputRow メソッドを呼び出します。
カスタム コードの記述
カスタム変換先コンポーネントの作成を終了するには、必要に応じて ScriptMain クラスで使用できる次のメソッドにスクリプトを記述する場合があります。
- 外部データ ソースに接続する場合は、AcquireConnections メソッドをオーバーライドします。接続マネージャから、接続オブジェクトまたは必要な接続情報を抽出します。
- データを保存する準備のため、PreExecute メソッドをオーバーライドします。たとえば、このメソッド内で SqlCommand およびそのパラメータを作成し、設定することができます。
- 各入力行を外部データ ソースにコピーするには、オーバーライドされた ProcessInputRow メソッドを使用します。たとえば、SQL Server 変換先の場合、列の値を SqlCommand のパラメータにコピーし、各行で 1 回ずつコマンドを実行できます。フラット ファイル変換先の場合、各列の値を列区切り記号で区切って StreamWriter に書き込むことができます。
- 必要に応じて外部データ ソースとの接続を切断し、その他の必要なクリーンアップ作業を実行するには、PostExecute メソッドをオーバーライドします。
例
次の例では、変換先コンポーネントを作成するために ScriptMain クラスで必要なコードを示します。
メモ : |
---|
これらの例では、サンプル データベース AdventureWorks の Person.Address テーブルを使用して、その第 1 列および第 4 列、つまり int 型の AddressID および nvarchar(30) 型の City の各列を、データ フローにそのまま渡します。このセクションの変換元、変換、および変換先の例でも、同じデータが使用されます。他の前提条件および仮定条件については、それぞれの例で説明します。 |
ADO.NET 変換先の例
この例では、既存の ADO.NET 接続マネージャを使用して、データ フローのデータを Microsoft SQL Server テーブルに保存する変換先コンポーネントを示します。
このサンプル コードを実行する場合は、パッケージやコンポーネントを次のように設定する必要があります。
SqlClient プロバイダを使用する ADO.NET 接続マネージャを作成して、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 などのわかりやすい名前に変更します。
[スクリプト] ページで、[スクリプトのデザイン] をクリックし、次のスクリプトを入力します。スクリプト開発環境を閉じます。
[接続マネージャ] ページで、ADO.NET 接続マネージャを追加または作成し、MyADONETConnectionManager などのわかりやすい名前を付けます。
[スクリプト変換エディタ] を閉じ、サンプルを実行します。
Imports System.Data.SqlClient
...
Public Class ScriptMain
Inherits UserComponent
Dim connMgr As IDTSConnectionManager90
Dim sqlConn As SqlConnection
Dim sqlCmd As SqlCommand
Dim sqlParam As SqlParameter
Public Overrides Sub AcquireConnections(ByVal Transaction As Object)
connMgr = Me.Connections.MyADONETConnectionManager
sqlConn = CType(connMgr.AcquireConnection(Nothing), SqlConnection)
End Sub
Public Overrides Sub PreExecute()
sqlCmd = New SqlCommand("INSERT INTO Person.Address2(AddressID, City) " & _
"VALUES(@addressid, @city)", sqlConn)
sqlParam = New SqlParameter("@addressid", SqlDbType.Int)
sqlCmd.Parameters.Add(sqlParam)
sqlParam = New SqlParameter("@city", SqlDbType.NVarChar, 30)
sqlCmd.Parameters.Add(sqlParam)
End Sub
Public Overrides Sub MyAddressInput_ProcessInputRow(ByVal Row As MyAddressInputBuffer)
With sqlCmd
.Parameters("@addressid").Value = Row.AddressID
.Parameters("@city").Value = Row.City
.ExecuteNonQuery()
End With
End Sub
Public Overrides Sub ReleaseConnections()
connMgr.ReleaseConnection(sqlConn)
End Sub
End Class
フラット ファイル ソースの例
この例では、既存のフラット ファイル接続マネージャを使用して、データ フローのデータをフラット ファイルに保存する変換先コンポーネントを示します。
このサンプル コードを実行する場合は、パッケージやコンポーネントを次のように設定する必要があります。
- 変換先ファイルに接続するフラット ファイル接続マネージャを作成します。ファイルが存在しない場合は、変換先コンポーネントによって作成されます。変換先ファイルを、AddressID 列および City 列を含む、コンマ区切りファイルとして構成します。
- 新しいスクリプト コンポーネントを [データ フロー] デザイナ画面に追加し、変換先として構成します。
- SSIS デザイナで、上流変換元の出力または変換の出力を変換先コンポーネントに接続します (変換を介さずに変換元を直接変換先に接続することもできます)。この出力には、サンプル データベース AdventureWorks サンプル データベースの Person.Address テーブルから、少なくとも AddressID 列および City 列を含むデータが渡される必要があります。
- [スクリプト変換エディタ] を開きます。[入力列] ページで、AddressID 列と City 列を選択します。
- [入力および出力] ページで、入出力を MyAddressInput などのわかりやすい名前に変更します。
- [スクリプト] ページで、[スクリプトのデザイン] をクリックし、次のスクリプトを入力します。スクリプト開発環境を閉じます。
- [接続マネージャ] ページで、フラット ファイル接続マネージャを追加または作成し、MyFlatFileDestConnectionManager などのわかりやすい名前を付けます。
- [スクリプト変換エディタ] を閉じ、サンプルを実行します。
Imports System.IO
...
Public Class ScriptMain
Inherits UserComponent
Dim copiedAddressFile As String
Private textWriter As StreamWriter
Private columnDelimiter As String = ","
Public Overrides Sub AcquireConnections(ByVal Transaction As Object)
Dim connMgr As IDTSConnectionManager90 = _
Me.Connections.MyFlatFileDestConnectionManager
copiedAddressFile = CType(connMgr.AcquireConnection(Nothing), String)
End Sub
Public Overrides Sub PreExecute()
textWriter = New StreamWriter(copiedAddressFile, False)
End Sub
Public Overrides Sub MyAddressInput_ProcessInputRow(ByVal Row As MyAddressInputBuffer)
With textWriter
If Not Row.AddressID_IsNull Then
.Write(Row.AddressID)
End If
.Write(columnDelimiter)
If Not Row.City_IsNull Then
.Write(Row.City)
End If
.WriteLine()
End With
End Sub
Public Overrides Sub PostExecute()
textWriter.Close()
End Sub
End Class
変更履歴
リリース | 履歴 |
---|---|
2006 年 7 月 17 日 |
|
参照
概念
スクリプト コンポーネントによる変換元の作成
カスタム変換先コンポーネントの開発