スクリプト コンポーネントによる変換元の作成
Integration Services パッケージのデータ フロー内で変換元コンポーネントを使用すると、データ ソースからデータを読み込み、下流にある変換や変換先に渡すことができます。通常、データ ソースへの接続には、既存の接続マネージャーを使用します。
スクリプト コンポーネントの概要については、「スクリプト コンポーネントによるデータ フローの拡張」を参照してください。
スクリプト コンポーネントおよびそれによって生成されるインフラストラクチャ コードを活用すれば、カスタム データ フロー コンポーネントを開発するための手順を大幅に簡略化できます。スクリプト コンポーネントの動作のしくみを理解するため、カスタム データ フロー コンポーネントの開発手順を理解しておくと役立つ場合があります。「カスタム データ フロー コンポーネントの開発」のセクション、特に「カスタム変換元コンポーネントの開発」のトピックを参照してください。
変換元コンポーネントの概要
SSIS デザイナーの [データ フロー] ペインにスクリプト コンポーネントを追加すると、[スクリプト コンポーネントの種類を選択] ダイアログ ボックスが開き、[変換元]、[変換先]、[変換] スクリプトのいずれかを選択するように求められます。このダイアログ ボックスで、[変換元] を選択します。
メタデータ デザイン モードでの変換元コンポーネントの構成
変換元コンポーネントの作成を選択したら、[スクリプト変換エディター] を使用して、コンポーネントを構成します。詳細については、「スクリプト コンポーネント エディターでのスクリプト コンポーネントの構成」を参照してください。
データ フロー変換元コンポーネントに入力はありませんが、1 つ以上の出力を設定できます。コンポーネントの出力の設定は、メタデータ デザイン モードでカスタム スクリプトを記述する前に完了する必要のある作業の 1 つです。これを行うには、[スクリプト変換エディター] を使用します。
[スクリプト変換エディター] の [スクリプト] ページにある [ScriptLanguage] プロパティで、スクリプト言語を指定することもできます。
注 |
---|
スクリプト コンポーネントとスクリプト タスクの既定のスクリプト言語を設定するには、[オプション] ダイアログ ボックスの [全般] ページにある [スクリプト言語] オプションを使用します。詳細については、「[全般] ページ」を参照してください。 |
接続マネージャーの追加
通常、変換元コンポーネントは既存の接続マネージャーを使用してデータ ソースに接続し、データをデータ フローに読み込みます。[スクリプト変換エディター] の [接続マネージャー] ページで [追加] をクリックして、適切な接続マネージャーを追加します。
ただし、接続マネージャーは、便宜上、特定の種類のデータ ソースに接続するために必要な情報をカプセル化して格納するユニットにすぎません。データの読み込みや保存、場合によってはデータ ソースとの接続や切断を行うためには、独自のカスタム コードを記述する必要もあります。
スクリプト コンポーネントでの接続マネージャーの使用方法に関する一般情報については、「スクリプト コンポーネントでのデータ ソースへの接続」を参照してください。
[スクリプト変換エディター] の [接続マネージャー] ページの詳細については、「[スクリプト変換エディタ] ([接続マネージャ] ページ)」を参照してください。
出力および出力列の設定
変換元コンポーネントに入力はありませんが、1 つ以上の出力を設定できます。[スクリプト変換エディター] の [入力および出力] ページには、既定で 1 つの出力が作成されていますが、出力列は作成されていません。エディターのこのページで、必要に応じて次の項目を設定します。
各出力に対する出力列は、手動で追加して設定する必要があります。各出力に対する [出力列] フォルダーを選択し、[列の追加] および [列の削除] ボタンを使用して、変換元コンポーネントの各出力に対する出力列を管理します。後でスクリプト内で出力列を参照する際には、ここで割り当てた名前、および自動生成されたコードによって作成された、型指定されたアクセサー プロパティを使用します。
予期しない値を含む行に対するシミュレートされたエラー出力など、1 つ以上の出力を追加して作成できます。[出力の追加] および [出力の削除] ボタンを使用して、変換元コンポーネントの出力を管理します。すべての入力行は使用可能なすべての出力に送られます。ただし、出力の ExclusionGroup プロパティに 0 でない同じ値を指定すると、各行を、同じ ExclusionGroup の値を共有する出力のうちいずれか 1 つにのみ送ることもできます。ExclusionGroup に指定するために選択した整数値に、特別な意味はありません。
注 すべての行を出力しない場合は、0 以外の ExclusionGroup プロパティ値を単一の出力で使用することもできます。ただし、この場合は、出力に送信する各行について、DirectRowTo<outputbuffer> メソッドを明示的に呼び出す必要があります。
出力にはわかりやすい名前を付けておくことができます。後で出力を参照する際には、スクリプト内での名前、および自動生成されたコードによって作成された、型指定されたアクセサー プロパティを使用します。
通常、同じ ExclusionGroup 内の複数の出力には、同じ出力列が含まれます。ただし、シミュレートされたエラー出力を作成するには、エラー情報を格納するために列の追加が必要となる場合があります。データ フロー エンジンがエラー行を処理する方法については、「データ フロー コンポーネントでのエラー出力の使用」を参照してください。ただし、スクリプト コンポーネントでは、独自のコードを記述して、追加した列に該当するエラー情報を格納する必要があります。詳細については、「スクリプト コンポーネントに対するエラー出力のシミュレート」を参照してください。
[スクリプト変換エディター] の [入力および出力] ページの詳細については、「[スクリプト変換エディタ] ([入力および出力] ページ)」を参照してください。
変数の追加
既存の変数の値をスクリプト内で使用する場合、[スクリプト変換エディター] の [スクリプト] ページで、ReadOnlyVariables プロパティおよび ReadWriteVariables プロパティのフィールドに追加できます。
プロパティ フィールドに複数の変数を入力する場合は、変数名をコンマで区切ります。また、ReadOnlyVariables プロパティ フィールドや ReadWriteVariables プロパティ フィールドの横にある参照ボタン ([...]) をクリックして [変数の選択] ダイアログ ボックスで変数を選択することによっても、複数の変数を入力できます。
スクリプト コンポーネントで変数を使用する方法に関する一般情報については、「スクリプト コンポーネントでの変数の使用」を参照してください。
[スクリプト変換エディター] の [スクリプト] ページの詳細については、「[スクリプト変換エディタ] ([スクリプト] ページ)」を参照してください。
コード デザイン モードでの変換元コンポーネントのスクリプト作成
コンポーネントのメタデータを設定したら、Microsoft Visual Studio Tools for Applications (VSTA) IDE を開き、カスタム スクリプトのコードを作成します。VSTA を開くには、[スクリプト変換エディター] の [スクリプト] ページで、[スクリプトの編集] をクリックします。[ScriptLanguage] プロパティで選択したスクリプト言語に応じて Microsoft Visual Basic 2008 または Microsoft Visual C# 2008 のいずれかを使用し、独自のスクリプトを記述できます。
スクリプト コンポーネントを使用して作成するすべての種類のコンポーネントについては、「スクリプト コンポーネントのコーディングおよびデバッグ」を参照してください。
自動生成されたコードについて
変換元コンポーネントを作成、設定した後で VSTA IDE を開くと、コード エディターには ScriptMain クラスが編集可能な状態で表示されます。この ScriptMain クラスにカスタム コードを記述します。
ScriptMain クラスには、CreateNewOutputRows メソッドのスタブが含まれています。CreateNewOutputRows は、変換元コンポーネントの最重要メソッドです。
VSTA の [プロジェクト エクスプローラー] ウィンドウを開くと、スクリプト コンポーネントにより、BufferWrapper および ComponentWrapper というプロジェクト アイテムが、読み取り専用の状態で自動生成されていることもわかります。ScriptMain クラスは、ComponentWrapper プロジェクト アイテム内の UserComponent クラスを継承します。
実行時には、データ フロー エンジンが UserComponent クラスの PrimeOutput メソッドを呼び出します。これは親クラスである ScriptComponent の PrimeOutput メソッドをオーバーライドします。次に、PrimeOutput メソッドは次のメソッドを呼び出します。
CreateNewOutputRows メソッド。これを ScriptMain でオーバーライドして、最初は空である出力バッファーに、データ ソースの行を追加します。
FinishOutputs メソッド。既定では空です。このメソッドを ScriptMain でオーバーライドして、出力を完了するために必要な処理を実行します。
MarkOutputsAsFinished プライベート メソッド。これは、親クラス ScriptBuffer の SetEndOfRowset メソッドを呼び出し、出力が完了したことをデータ フロー エンジンに通知します。独自に記述するコード内で、SetEndOfRowset を呼び出す必要はありません。
カスタム コードの記述
カスタム変換元コンポーネントの作成を終了するには、必要に応じて ScriptMain クラスで使用できる次のメソッドにスクリプトを記述する場合があります。
外部データ ソースに接続する場合は、AcquireConnections メソッドをオーバーライドします。接続マネージャーから、接続オブジェクトまたは必要な接続情報を抽出します。
変換元データをすべて同時に読み込める場合は、PreExecute メソッドをオーバーライドしてデータを読み込みます。たとえば、SQL Server データベースへの ADO.NET 接続に対して SqlCommand を実行し、すべての変換元データを同時に SqlDataReader に読み込むことができます。たとえば、テキスト ファイルを読み取る場合など、変換元データを 1 行ずつ読み込む必要がある場合は、CreateNewOutputRows の行をループするたびにデータを読み込むことができます。
オーバーライドされた CreateNewOutputRows メソッドを使用して、空の出力バッファーに新しい行を追加し、新しい出力行に各列の値を格納します。各出力バッファーの AddRow メソッドを使用して空の行を新しく追加し、各列の値を設定します。通常は、外部ソースから読み込まれた列から値をコピーします。
PostExecute メソッドをオーバーライドして、データの処理を終了します。たとえば、データを読み込むために使用した SqlDataReader を閉じることができます。
ReleaseConnections メソッドを必要に応じてオーバーライドして、外部データ ソースとの接続を切断します。
使用例
次の例では、変換元コンポーネントを作成するために、ScriptMain クラスで必要なカスタム コードを示します。
注 |
---|
これらの例では、サンプル データベース AdventureWorks2008R2 の Person.Address テーブルを使用して、その第 1 列および第 4 列、つまり int 型の AddressID 列と nvarchar(30) 型の City 列をデータ フローにそのまま渡します。このセクションの変換元、変換、および変換先の例でも、同じデータが使用されます。他の前提条件および仮定条件については、それぞれの例で説明します。 |
ADO.NET ソースの例
この例では、既存の ADO.NET 接続マネージャーを使用して、SQL Server のテーブルからデータを読み込み、データ フローに送る変換元コンポーネントを示します。
このサンプル コードを実行する場合は、パッケージやコンポーネントを次のように設定する必要があります。
SqlClient プロバイダーを使用する ADO.NET 接続マネージャーを作成して、AdventureWorks2008R2 データベースに接続します。
新しいスクリプト コンポーネントを [データ フロー] デザイナー画面に追加し、変換元として構成します。
[スクリプト変換エディター] を開きます。[入力および出力] ページで、既定の出力を MyAddressOutput などのわかりやすい名前に変更し、AddressID と City という 2 つの出力列を追加して設定します。
注 City 出力列のデータ型は必ず DT_WSTR に変更してください。
[接続マネージャー] ページで、ADO.NET 接続マネージャーを追加または作成し、MyADONETConnection などの名前を付けます。
[スクリプト] ページで、[スクリプトの編集] をクリックし、続きのスクリプトを入力します。スクリプト開発環境と [スクリプト変換エディター] を閉じます。
SQL Server の変換先、「スクリプト コンポーネントによる変換先の作成」で説明されている変換先コンポーネントの例など、AddressID 列および City 列が含まれる変換先コンポーネントを作成して構成します。変換元のコンポーネントを変換先に接続します (変換を介さずに変換元を直接変換先に接続することもできます)。AdventureWorks2008R2 データベースで次の Transact-SQL コマンドを実行して、変換先テーブルを作成できます。
CREATE TABLE [Person].[Address2]( [AddressID] [int] NOT NULL, [City] [nvarchar](30) NOT NULL )
サンプルを実行します。
Imports System.Data.SqlClient ... Public Class ScriptMain Inherits UserComponent Dim connMgr As IDTSConnectionManager100 Dim sqlConn As SqlConnection Dim sqlReader As SqlDataReader Public Overrides Sub AcquireConnections(ByVal Transaction As Object) connMgr = Me.Connections.MyADONETConnection sqlConn = CType(connMgr.AcquireConnection(Nothing), SqlConnection) End Sub Public Overrides Sub PreExecute() Dim cmd As New SqlCommand("SELECT AddressID, City, StateProvinceID FROM Person.Address", sqlConn) sqlReader = cmd.ExecuteReader End Sub Public Overrides Sub CreateNewOutputRows() Do While sqlReader.Read With MyAddressOutputBuffer .AddRow() .AddressID = sqlReader.GetInt32(0) .City = sqlReader.GetString(1) End With Loop End Sub Public Overrides Sub PostExecute() sqlReader.Close() End Sub Public Overrides Sub ReleaseConnections() connMgr.ReleaseConnection(sqlConn) End Sub End Class
using System.Data.SqlClient; public class ScriptMain: UserComponent { IDTSConnectionManager100 connMgr; SqlConnection sqlConn; SqlDataReader sqlReader; public override void AcquireConnections(object Transaction) { connMgr = this.Connections. MyADONETConnection; sqlConn = (SqlConnection)connMgr.AcquireConnection(null); } public override void PreExecute() { SqlCommand cmd = new SqlCommand("SELECT AddressID, City, StateProvinceID FROM Person.Address", sqlConn); sqlReader = cmd.ExecuteReader(); } public override void CreateNewOutputRows() { while (sqlReader.Read()) { { MyAddressOutputBuffer.AddRow(); MyAddressOutputBuffer.AddressID = sqlReader.GetInt32(0); MyAddressOutputBuffer.City = sqlReader.GetString(1); } } } public override void PostExecute() { sqlReader.Close(); } public override void ReleaseConnections() { connMgr.ReleaseConnection(sqlConn); } }
フラット ファイル ソースの例
この例では、既存のフラット ファイル接続マネージャーを使用して、フラット ファイルからデータを読み込み、データ フローに送る変換元コンポーネントを示します。フラット ファイル ソースのデータは、SQL Server からエクスポートすることにより作成されます。
このサンプル コードを実行する場合は、パッケージやコンポーネントを次のように構成する必要があります。
SQL Server インポートおよびエクスポート ウィザードを使用して、サンプル データベース AdventureWorks2008R2 から、Person.Address テーブルをコンマ区切りフラット ファイルにエクスポートします。この例では、ファイル名を ExportedAddresses.txt とします。
エクスポートされたデータ ファイルに接続するフラット ファイル接続マネージャーを作成します。
新しいスクリプト コンポーネントを [データ フロー] デザイナー画面に追加し、変換元として構成します。
[スクリプト変換エディター] を開きます。[入力および出力] ページで、既定の出力を MyAddressOutput などのわかりやすい名前に変更します。AddressID と City という 2 つの出力列を追加して構成します。
[接続マネージャー] ページで、フラット ファイル接続マネージャーを追加または作成し、MyFlatFileSrcConnectionManager などのわかりやすい名前を付けます。
[スクリプト] ページで、[スクリプトの編集] をクリックし、続きのスクリプトを入力します。スクリプト開発環境と [スクリプト変換エディター] を閉じます。
SQL Server の変換先、または「スクリプト コンポーネントによる変換先の作成」で説明されている変換先コンポーネントの例など、変換先コンポーネントを作成して構成します。変換元のコンポーネントを変換先に接続します (変換を介さずに変換元を直接変換先に接続することもできます)。AdventureWorks2008R2 データベースで次の Transact-SQL コマンドを実行して、変換先テーブルを作成できます。
CREATE TABLE [Person].[Address2]( [AddressID] [int] NOT NULL, [City] [nvarchar](30) NOT NULL )
サンプルを実行します。
Imports System.IO ... Public Class ScriptMain Inherits UserComponent Private textReader As StreamReader Private exportedAddressFile As String Public Overrides Sub AcquireConnections(ByVal Transaction As Object) Dim connMgr As IDTSConnectionManager100 = _ Me.Connections.MyFlatFileSrcConnectionManager exportedAddressFile = _ CType(connMgr.AcquireConnection(Nothing), String) End Sub Public Overrides Sub PreExecute() MyBase.PreExecute() textReader = New StreamReader(exportedAddressFile) End Sub Public Overrides Sub CreateNewOutputRows() Dim nextLine As String Dim columns As String() Dim delimiters As Char() delimiters = ",".ToCharArray nextLine = textReader.ReadLine Do While nextLine IsNot Nothing columns = nextLine.Split(delimiters) With MyAddressOutputBuffer .AddRow() .AddressID = columns(0) .City = columns(3) End With nextLine = textReader.ReadLine Loop End Sub Public Overrides Sub PostExecute() MyBase.PostExecute() textReader.Close() End Sub End Class
using System.IO; public class ScriptMain: UserComponent { private StreamReader textReader; private string exportedAddressFile; public override void AcquireConnections(object Transaction) { IDTSConnectionManager100 connMgr = this.Connections.MyFlatFileSrcConnectionManager; exportedAddressFile = (string)connMgr.AcquireConnection(null); } public override void PreExecute() { base.PreExecute(); textReader = new StreamReader(exportedAddressFile); } public override void CreateNewOutputRows() { string nextLine; string[] columns; char[] delimiters; delimiters = ",".ToCharArray(); nextLine = textReader.ReadLine(); while (nextLine != null) { columns = nextLine.Split(delimiters); { MyAddressOutputBuffer.AddRow(); MyAddressOutputBuffer.AddressID = columns[0]; MyAddressOutputBuffer.City = columns[3]; } nextLine = textReader.ReadLine(); } } public override void PostExecute() { base.PostExecute(); textReader.Close(); } }
|