スクリプト コンポーネントによる変換元の作成

更新 : 2006 年 7 月 17 日

Integration Services パッケージのデータ フロー内で変換元コンポーネントを使用すると、データ ソースからデータを読み込み、下流にある変換や変換先に渡すことができます。通常、データ ソースへの接続には、既存の接続マネージャを使用します。

スクリプト コンポーネントの概要については、「スクリプト コンポーネントによるデータ フローの拡張」を参照してください。

スクリプト コンポーネントおよびそれによって生成されるインフラストラクチャ コードを活用すれば、カスタム データ フロー コンポーネントを開発するための手順を大幅に簡略化できます。スクリプト コンポーネントの動作のしくみを理解するため、カスタム データ フロー コンポーネントの開発手順を理解しておくと役立つ場合があります。「カスタム データ フロー コンポーネントの開発」のセクション、特に「カスタム変換元コンポーネントの開発」のトピックを参照してください。

変換元コンポーネントの概要

SSIS デザイナの [データ フロー] ペインにスクリプト コンポーネントを追加すると、[スクリプト コンポーネントの種類を選択] ダイアログ ボックスが開き、[変換元]、[変換先]、[変換] スクリプトのいずれかを選択するように求められます。このダイアログ ボックスで、[変換元] を選択します。

メタデータ デザイン モードでの変換元コンポーネントの構成

変換元コンポーネントの作成を選択したら、[スクリプト変換エディタ] を使用して、コンポーネントを構成します。詳細については、「スクリプト コンポーネント エディタでのスクリプト コンポーネントの構成」を参照してください。

データ フロー変換元コンポーネントに入力はありませんが、1 つ以上の出力を設定できます。コンポーネントの出力の設定は、メタデータ デザイン モードでカスタム スクリプトを記述する前に完了する必要のある作業の 1 つです。これを行うには、[スクリプト変換エディタ] を使用します。

接続マネージャの追加

通常、変換元コンポーネントは既存の接続マネージャを使用してデータ ソースに接続し、データをデータ フローに読み込みます。[スクリプト変換エディタ][接続マネージャ] ページで [追加] をクリックして、適切な接続マネージャを追加します。

ただし、接続マネージャは、便宜上、特定の種類のデータ ソースに接続するために必要な情報をカプセル化して格納するユニットにすぎません。データの読み込みや保存、場合によってはデータ ソースとの接続や切断を行うためには、独自のカスタム コードを記述する必要もあります。

スクリプト コンポーネントでの接続マネージャの使用方法に関する一般情報については、「スクリプト コンポーネントでのデータ ソースへの接続」を参照してください。

[スクリプト変換エディタ][接続マネージャ] ページの詳細については、「[スクリプト変換エディタ] ([接続マネージャ] ページ)」を参照してください。

出力および出力列の設定

変換元コンポーネントに入力はありませんが、1 つ以上の出力を設定できます。[スクリプト変換エディタ][入力および出力] ページには、既定で 1 つの出力が作成されていますが、出力列は作成されていません。エディタのこのページで、必要に応じて次の項目を設定します。

  • 各出力に対する出力列は、手動で追加して設定する必要があります。各出力に対する [出力列] フォルダを選択し、[列の追加] および [列の削除] ボタンを使用して、変換元コンポーネントの各出力に対する出力列を管理します。後でスクリプト内で出力列を参照する際には、ここで割り当てた名前、および自動生成されたコードによって作成された、型指定されたアクセサ プロパティを使用します。
  • 予期しない値を含む行に対するシミュレートされたエラー出力など、1 つ以上の出力を追加して作成できます。[出力の追加] および [出力の削除] ボタンを使用して、変換元コンポーネントの出力を管理します。すべての入力行は使用可能なすべての出力に送られます。ただし、出力の ExclusionGroup プロパティに 0 でない同じ値を指定すると、各行を、同じ ExclusionGroup の値を共有する出力のうちいずれか 1 つにのみ送ることもできます。ExclusionGroup に指定するために選択した整数値に、特別な意味はありません。
    ms136060.note(ja-jp,SQL.90).gifメモ :
    すべての行を出力しない場合は、0 以外の ExclusionGroup プロパティ値を単一の出力で使用することもできます。ただし、この場合は、出力に送信する各行について、DirectRowTo<outputbuffer> メソッドを明示的に呼び出す必要があります。
  • 出力にはわかりやすい名前を付けておくことができます。後で出力を参照する際には、スクリプト内での名前、および自動生成されたコードによって作成された、型指定されたアクセサ プロパティを使用します。
  • 通常、同じ ExclusionGroup 内の複数の出力には、同じ出力列が含まれます。ただし、シミュレートされたエラー出力を作成するには、エラー情報を格納するために列の追加が必要となる場合があります。データ フロー エンジンがエラー行を処理する方法については、「データ フロー コンポーネントでのエラー出力の使用」を参照してください。ただし、スクリプト コンポーネントでは、独自のコードを記述して、追加した列に該当するエラー情報を格納する必要があります。詳細については、「スクリプト コンポーネントに対するエラー出力のシミュレート」を参照してください。

[スクリプト変換エディタ][入力および出力] ページの詳細については、「[スクリプト変換エディタ] ([入力および出力] ページ)」を参照してください。

変数の追加

既存の変数の値をスクリプト内で使用する場合、[スクリプト変換エディタ][スクリプト] ページで、ReadOnlyVariables プロパティおよび ReadWriteVariables プロパティのフィールドに追加できます。複数の変数を追加する場合は、変数名をコンマで区切ります。

スクリプト コンポーネントで変数を使用する方法に関する一般情報については、「スクリプト コンポーネントでの変数の使用」を参照してください。

[スクリプト変換エディタ][スクリプト] ページの詳細については、「[スクリプト変換エディタ] ([スクリプト] ページ)」を参照してください。

コード デザイン モードでの変換元コンポーネントのスクリプト作成

コンポーネントのメタデータをすべて設定したら、Visual Studio for Applications (VSA) IDE を開き、Visual Basic .NET 言語を使用してカスタム スクリプトのコードを作成します。VSA IDE を開くには、[スクリプト変換エディタ][スクリプト] ページで、[スクリプトのデザイン] をクリックします。

スクリプト コンポーネントを使用して作成したすべての種類のコンポーネントについては、「スクリプト コンポーネントのコーディングおよびデバッグ」を参照してください。

自動生成されたコードについて

変換元コンポーネントを作成、設定した後で VSA IDE を開くと、コード エディタには ScriptMain クラスが編集可能な状態で表示されます。また、CreateNewOutputRows メソッドがスタブとして表示されます。カスタム コードは ScriptMain クラスに記述します。また、CreateNewOutputRows は変換元コンポーネントの最重要メソッドです。

VSA の [プロジェクト エクスプローラ] ウィンドウを開くと、スクリプト コンポーネントにより、BufferWrapper および ComponentWrapper というプロジェクト アイテムが、読み取り専用の状態で自動生成されていることもわかります。ScriptMain クラスは、ComponentWrapper プロジェクト アイテム内の UserComponent クラスを継承します。

実行時には、データ フロー エンジンが UserComponent クラスの PrimeOutput メソッドを呼び出します。これは親クラスである ScriptComponentPrimeOutput メソッドをオーバーライドします。次に、PrimeOutput メソッドは次のメソッドを呼び出します。

  1. CreateNewOutputRows メソッド。これを ScriptMain でオーバーライドして、最初は空である出力バッファに、データ ソースの行を追加します。
  2. FinishOutputs メソッド。既定では空です。このメソッドを ScriptMain でオーバーライドして、出力を完了するために必要な処理を実行します。
  3. MarkOutputsAsFinished プライベート メソッド。これは、親クラス ScriptBufferSetEndOfRowset メソッドを呼び出し、出力が完了したことをデータ フロー エンジンに通知します。独自に記述するコード内で、SetEndOfRowset を呼び出す必要はありません。

カスタム コードの記述

カスタム変換元コンポーネントの作成を終了するには、必要に応じて ScriptMain クラスで使用できる次のメソッドにスクリプトを記述する場合があります。

  1. 外部データ ソースに接続する場合は、AcquireConnections メソッドをオーバーライドします。接続マネージャから、接続オブジェクトまたは必要な接続情報を抽出します。
  2. 変換元データをすべて同時に読み込める場合は、PreExecute メソッドをオーバーライドしてデータを読み込みます。たとえば、SQL Server データベースへの ADO.NET 接続に対して SqlCommand を実行し、すべての変換元データを同時に SqlDataReader に読み込むことができます。たとえば、テキスト ファイルを読み取る場合など、変換元データを 1 行ずつ読み込む必要がある場合は、CreateNewOutputRows の行をループするたびにデータを読み込むことができます。
  3. オーバーライドされた CreateNewOutputRows メソッドを使用して、空の出力バッファに新しい行を追加し、新しい出力行に各列の値を格納します。各出力バッファの AddRow メソッドを使用して空の行を新しく追加し、各列の値を設定します。通常は、外部ソースから読み込まれた列から値をコピーします。
  4. PostExecute メソッドをオーバーライドして、データの処理を終了します。たとえば、データを読み込むために使用した SqlDataReader を閉じることができます。
  5. ReleaseConnections メソッドを必要に応じてオーバーライドして、外部データ ソースとの接続を切断します。

次の例では、変換元コンポーネントを作成するために、ScriptMain クラスで必要なカスタム コードを示します。

ms136060.note(ja-jp,SQL.90).gifメモ :
これらの例では、サンプル データベース AdventureWorksPerson.Address テーブルを使用して、その第 1 列および第 4 列、つまり int 型の AddressID および nvarchar(30) 型の City の各列を、データ フローにそのまま渡します。このセクションの変換元、変換、および変換先の例でも、同じデータが使用されます。他の前提条件および仮定条件については、それぞれの例で説明します。

ADO.NET ソースの例

この例では、既存の ADO.NET 接続マネージャを使用して、SQL Server のテーブルからデータを読み込み、データ フローに送る変換元コンポーネントを示します。

このサンプル コードを実行する場合は、パッケージやコンポーネントを次のように設定する必要があります。

  1. SqlClient プロバイダを使用する ADO.NET 接続マネージャを作成して、AdventureWorks データベースに接続します。

  2. 新しいスクリプト コンポーネントを [データ フロー] デザイナ画面に追加し、変換元として構成します。

  3. [スクリプト変換エディタ] を開きます。[入力および出力] ページで、既定の出力を MyAddressOutput などのわかりやすい名前に変更し、AddressIDCity という 2 つの出力列を追加して設定します。

  4. [スクリプト] ページで、[スクリプトのデザイン] をクリックし、次のスクリプトを入力します。スクリプト開発環境を閉じます。

  5. [接続マネージャ] ページで、ADO.NET 接続マネージャを追加または作成し、MyADONETConnection などのわかりやすい名前を付けます。[スクリプト変換エディタ] を閉じます。

  6. SQL Server の変換先、または「スクリプト コンポーネントによる変換先の作成」で説明されている変換先コンポーネントの例などの変換先コンポーネントを作成、構成します。この変換先コンポーネントには、AddressID 列および City 列が含まれます。変換元のコンポーネントを変換先に接続します (変換を介さずに変換元を直接変換先に接続することもできます)。AdventureWorks データベースで次の Transact-SQL コマンドを実行して、変換先テーブルを作成できます。

    CREATE TABLE [Person].[Address2](
        [AddressID] [int] NOT NULL,
        [City] [nvarchar](30) NOT NULL
    )
    
  7. サンプルを実行します。

Imports System.Data.SqlClient
...
Public Class ScriptMain
    Inherits UserComponent

    Dim connMgr As IDTSConnectionManager90
    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

フラット ファイル ソースの例

この例では、既存のフラット ファイル接続マネージャを使用して、フラット ファイルからデータを読み込み、データ フローに送る変換元コンポーネントを示します。フラット ファイル ソースのデータは、SQL Server からエクスポートすることにより作成されます。

このサンプル コードを実行する場合は、パッケージやコンポーネントを次のように構成する必要があります。

  1. SQL Server インポートおよびエクスポート ウィザードを使用して、サンプル データベース AdventureWorks から、Person.Address テーブルをコンマ区切りフラット ファイルにエクスポートします。この例では、ファイル名を ExportedAddresses.txt とします。

  2. エクスポートされたデータ ファイルに接続するフラット ファイル接続マネージャを作成します。

  3. 新しいスクリプト コンポーネントを [データ フロー] デザイナ画面に追加し、変換元として構成します。

  4. [スクリプト変換エディタ] を開きます。[入力および出力] ページで、既定の出力を MyAddressOutput などのわかりやすい名前に変更します。AddressIDCity という 2 つの出力列を追加して構成します。

  5. [スクリプト] ページで、[スクリプトのデザイン] をクリックし、次のスクリプトを入力します。スクリプト開発環境を閉じます。

  6. [接続マネージャ] ページで、フラット ファイル接続マネージャを追加または作成し、MyFlatFileSrcConnectionManager などのわかりやすい名前を付けます。[スクリプト変換エディタ] を閉じます。

  7. SQL Server の変換先、または「スクリプト コンポーネントによる変換先の作成」で説明されている変換先コンポーネントの例のように、変換先コンポーネントを作成し、構成します。変換元のコンポーネントを変換先に接続します (変換を介さずに変換元を直接変換先に接続することもできます)。AdventureWorks データベースで次の Transact-SQL コマンドを実行して、変換先テーブルを作成できます。

    CREATE TABLE [Person].[Address2](
        [AddressID] [int] NOT NULL,
        [City] [nvarchar](30) NOT NULL
    )
    
  8. サンプルを実行します。

Imports System.IO
...
Public Class ScriptMain
    Inherits UserComponent

    Private textReader As StreamReader

    Public Overrides Sub AcquireConnections(ByVal Transaction As Object)

        Dim connMgr As IDTSConnectionManager90 = _
            Me.Connections.MyFlatFileSrcConnectionManager
        Dim exportedAddressFile As String = _
            CType(connMgr.AcquireConnection(Nothing), String)
        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 ReleaseConnections()

        textReader.Close()

    End Sub

End Class

変更履歴

リリース 履歴

2006 年 7 月 17 日

変更内容 :
  • 例の手順の順番を並べ替え、わかりやすく変更しました。

参照

概念

スクリプト コンポーネントによる変換先の作成
カスタム変換元コンポーネントの開発

ヘルプおよび情報

SQL Server 2005 の参考資料の入手