スクリプト コンポーネントのオブジェクト モデルについて
「スクリプト コンポーネントのコーディングとデバッグ](../extending-packages-scripting/data-flow-script-component/coding-and-debugging-the-script-component.md、スクリプト コンポーネント プロジェクトには、次の 3 つのプロジェクト項目が含まれています。
ScriptMain
アイテム。ScriptMain
クラスを含み、ここにカスタム コードを記述します。ScriptMain
クラスは、UserComponent
クラスを継承します。ComponentWrapper
アイテム。UserComponent
クラスを含みます。これは ScriptComponent のインスタンスで、データの処理やパッケージとのやり取りで使用するメソッドとプロパティが含まれています。ComponentWrapper
アイテムには、Connections
やVariables
の各コレクション クラスも含まれています。BufferWrapper
アイテム。各入力および各出力に対して ScriptBuffer から継承されるクラス、および各列に対する型指定されたプロパティが含まれています。
ScriptMain
アイテムにコードを記述する際には、このトピックで説明するオブジェクト、メソッド、およびプロパティを使用します。 ここで一覧されているすべてのメソッドを各コンポーネントが使用するわけではありませんが、使用される場合は、ここで示した順序で使用されます。
基本クラス ScriptComponent には、ここで説明しているメソッドのコードは実装されていません。 したがって、メソッド独自の実装に基本クラスの実装の呼び出しを追加する必要はありませんが、追加した場合でも問題は生じません。
特定の種類のスクリプト コンポーネントで、これらのクラスのメソッドおよびプロパティを使用する方法については、セクション「その他のスクリプト コンポーネントの例」をご覧ください。 サンプルについてのトピックでは、完全なコード例も示します。
AcquireConnections メソッド
通常、変換元および変換先は外部データ ソースに接続する必要があります。 基本クラス AcquireConnections の ScriptComponent メソッドをオーバーライドして、適切な接続マネージャーから、接続または接続情報を取得します。
次の例は、ADO.NET 接続マネージャーから System.Data.SqlClient.SqlConnection
を返します。
Dim connMgr As IDTSConnectionManager100
Dim sqlConn As SqlConnection
Public Overrides Sub AcquireConnections(ByVal Transaction As Object)
connMgr = Me.Connections.MyADONETConnection
sqlConn = CType(connMgr.AcquireConnection(Nothing), SqlConnection)
End Sub
次の例は、フラット ファイル接続マネージャーから完全パスおよびファイル名を返し、System.IO.StreamReader
を使用してこのファイルを開きます。
Private textReader As StreamReader
Public Overrides Sub AcquireConnections(ByVal Transaction As Object)
Dim connMgr As IDTSConnectionManager100 = _
Me.Connections.MyFlatFileSrcConnectionManager
Dim exportedAddressFile As String = _
CType(connMgr.AcquireConnection(Nothing), String)
textReader = New StreamReader(exportedAddressFile)
End Sub
PreExecute メソッド
データの行の処理を開始する前に 1 回だけ実行する必要のある処理がある場合は、基本クラス PreExecute の ScriptComponent メソッドをオーバーライドします。 たとえば、データの各行をデータ ソースに挿入するために変換先が使用するパラメーター化コマンドを、変換先に設定することができます。
Dim sqlConn As SqlConnection
Dim sqlCmd As SqlCommand
Dim sqlParam As SqlParameter
...
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
SqlConnection sqlConn;
SqlCommand sqlCmd;
SqlParameter sqlParam;
public override void 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);
}
入力および出力の処理
入力の処理
変換または変換先として構成されたスクリプト コンポーネントには、1 つの入力があります。
プロジェクト アイテム BufferWrapper が提供する機能
構成したコンポーネントの入力ごとに、プロジェクト アイテム BufferWrapper
には、ScriptBuffer から派生した、入力と同じ名前のクラスがあります。 各入力バッファー クラスには、次のプロパティ、関数、およびメソッドが含まれています。
選択された各入力列の、型指定された名前付きのアクセサー プロパティ。 これらのプロパティが読み取り専用か読み取り/書き込み可能かどうかは、 [スクリプト変換エディター] の [入力列] ページで、列に対して指定され [使用法の種類] によって決まります。
選択された各入力列の <column>_IsNull プロパティ。 このプロパティが読み取り専用か読み取り/書き込み可能かどうかも、列に対して指定された [使用法の種類] によって決まります。
設定された各出力の DirectRowTo<outputbuffer> メソッド。 行をフィルター選択して、同じ
ExclusionGroup
内の複数の出力のいずれかに行を出力する場合、このメソッドを使用します。次の入力行を取得するための
NextRow
関数、およびデータの最後のバッファーが処理されたかどうかを確認するためのEndOfRowset
関数。 通常、基本クラスUserComponent
に実装された入力処理メソッドを使用する場合、この関数は必要はありません。 次のセクションでは、基本クラスUserComponent
について詳細に説明します。
プロジェクト アイテム ComponentWrapper が提供する機能
プロジェクト アイテム ComponentWrapper には、ScriptComponent から派生する UserComponent
という名前のクラスがあります。 また、カスタム コードを記述する ScriptMain
クラスは、UserComponent
から派生します。 UserComponent
クラスには次のメソッドが含まれています。
ProcessInput
メソッドをオーバーライドして実装したメソッド。 これは、データ フロー エンジンが実行時にPreExecute
メソッドの次に呼び出すメソッドで、繰り返し呼び出される場合があります。ProcessInput
は、 <inputbuffer>_ProcessInput メソッドに処理を提供します。 次にProcessInput
メソッドは入力バッファーが末尾に達しているかどうかを確認し、達している場合は、オーバーライド可能なFinishOutputs
メソッドと private メソッドMarkOutputsAsFinished
を呼び出します。MarkOutputsAsFinished
メソッドは、次に最後の出力バッファーのSetEndOfRowset
を呼び出します。<inputbuffer>_ProcessInput メソッドのオーバーライド可能な実装。 この既定の実装では、単に各入力行の間をループし、<inputbuffer>_ProcessInputRow を呼び出します。
<inputbuffer>_ProcessInputRow メソッドのオーバーライド可能な実装。 既定の実装では、空のままです。 このメソッドは、カスタム データ処理コードを記述するために、通常はオーバーライドして使用します。
カスタム コードとして組み込むべき機能
ScriptMain
クラスの入力を処理するには、次のメソッドを使用できます。
入力行が渡されるたびにそのデータを処理するには、<inputbuffer>_ProcessInputRow をオーバーライドします。
入力行をループするときに追加の処理を行う必要がある場合にのみ、<inputbuffer>_ProcessInput をオーバーライドします (たとえば、すべての行が処理された後に他のアクションを実行するには、
EndOfRowset
をテストする必要があります)。 <inputbuffer>_ProcessInputRow を呼び出して行処理を実行します。出力を閉じる前に、出力に対して何らかの処理を行う場合は、
FinishOutputs
をオーバーライドします。
ProcessInput
メソッドは、これらのメソッドが適切な時点で確実に呼び出されるようにするものです。
出力の処理
変換元または変換として構成されたスクリプト コンポーネントには、1 つ以上の出力があります。
プロジェクト アイテム BufferWrapper が提供する機能
構成したコンポーネントの出力ごとに、プロジェクト アイテム BufferWrapper には、ScriptBuffer から派生した、出力と同じ名前のクラスがあります。 各出力バッファー クラスには、次のプロパティおよびメソッドが含まれています。
各出力列の、名前付きで型指定された、書き込み専用のアクセサー プロパティ。
列の値を
null
に設定するために使用できる、選択した各出力列の書き込み専用の<column>_IsNull プロパティ。空の新しい行を出力バッファーに追加するための
AddRow
メソッド。データ フロー エンジンに対し、これ以上データのバッファーがないことを知らせるための
SetEndOfRowset
メソッド。 現在のバッファーが、データの最後のバッファーであるかどうかを確認するためのEndOfRowset
関数もあります。 通常、基本クラスUserComponent
に実装された出力処理メソッドを使用する場合、この関数は必要はありません。
プロジェクト アイテム ComponentWrapper が提供する機能
プロジェクト アイテム ComponentWrapper には、ScriptComponent から派生する UserComponent
という名前のクラスがあります。 また、カスタム コードを記述する ScriptMain
クラスは、UserComponent
から派生します。 UserComponent
クラスには次のメソッドが含まれています。
PrimeOutput
メソッドをオーバーライドして実装したメソッド。 実行時、データ フロー エンジンは、このメソッドをProcessInput
の前に 1 回だけ呼び出します。PrimeOutput
はCreateNewOutputRows
メソッドに処理を渡します。 コンポーネントが変換元の場合 (つまりコンポーネントに入力がない場合)、PrimeOutput
はオーバーライド可能なFinishOutputs
メソッドと private メソッドMarkOutputsAsFinished
を呼び出します。MarkOutputsAsFinished
メソッドは、最後の出力バッファーのSetEndOfRowset
を呼び出します。CreateNewOutputRows
メソッドのオーバーライド可能な実装。 既定の実装では、空のままです。 このメソッドは、カスタム データ処理コードを記述するために、通常はオーバーライドして使用します。
カスタム コードとして組み込むべき機能
ScriptMain
クラスの出力を処理するには、次のメソッドを使用できます。
入力行を処理する前に出力行を追加して設定できる場合にのみ、
CreateNewOutputRows
をオーバーライドします。 たとえば、CreateNewOutputRows
を変換元に使用することはできますが、非同期出力型の変換では、入力データの処理中または処理後にAddRow
を呼び出す必要があります。出力を閉じる前に、出力に対して何らかの処理を行う場合は、
FinishOutputs
をオーバーライドします。
PrimeOutput
メソッドは、これらのメソッドが適切な時点で確実に呼び出されるようにするものです。
PostExecute メソッド
データの行を処理した後に 1 回だけ実行する必要のある処理がある場合は、基本クラス PostExecute の ScriptComponent メソッドをオーバーライドします。 たとえば、変換元でデータをデータ フローに読み込むために使用した System.Data.SqlClient.SqlDataReader
を閉じることができます。
重要
ReadWriteVariables
のコレクションは、PostExecute
メソッド内でのみ使用できます。 したがって、データ行を処理するたびにパッケージ変数の値を直接増やすことはできません。 代わりに、ローカル変数の値をインクリメントし、すべてのデータが処理された後、 PostExecute
メソッドでパッケージ変数の値をローカル変数の値に設定します。
ReleaseConnections メソッド
通常、変換元および変換先は外部データ ソースに接続する必要があります。 基本クラス ReleaseConnections の ScriptComponent メソッドをオーバーライドして、以前に AcquireConnections メソッドで開いた接続を閉じ、解放します。
Dim connMgr As IDTSConnectionManager100
...
Public Overrides Sub ReleaseConnections()
connMgr.ReleaseConnection(sqlConn)
End Sub
IDTSConnectionManager100 connMgr;
public override void ReleaseConnections()
{
connMgr.ReleaseConnection(sqlConn);
}
Integration Services を最新の状態に保つ
Microsoft からの最新のダウンロード、記事、サンプル、ビデオ、およびコミュニティから選択したソリューションについては、MSDN の Integration Services ページを参照してください。
MSDN の Integration Services のページを参照する
これらの更新が自動で通知されるようにするには、ページの RSS フィードを定期受信します。
参照
スクリプト コンポーネント エディターでのスクリプト コンポーネントの構成 [スクリプト コンポーネントのコーディングとデバッグ](../extending-packages-scripting/data-flow-script-component/coding-and-debugging-the-script-component.md