Présentation du modèle objet du composant Script
Tel qu'indiqué dans Codage et débogage du composant Script, le projet de composant Script contient trois éléments de projet :
L'élément ScriptMain, qui contient la classe ScriptMain dans laquelle vous écrivez votre code. La classe ScriptMain hérite de la classe UserComponent.
L'élément ComponentWrapper, qui contient la classe UserComponent, une instance de ScriptComponent contenant les méthodes et les propriétés qui permettent de traiter les données et d'interagir avec le package. L'élément ComponentWrapper contient également des classes de collection Connections et Variables.
L'élément BufferWrapper, qui contient des classes qui héritent de ScriptBuffer pour chaque entrée et sortie, et des propriétés typées pour chaque colonne.
Les objets, méthodes et propriétés présentés dans cette rubrique vous permettent d'écrire du code dans l'élément ScriptMain. Chaque composant n'utilise pas toutes les méthodes répertoriées ici ; cependant, lorsque ces méthodes sont utilisées, elles le sont dans l'ordre indiqué.
La classe de base ScriptComponent ne contient pas de code d'implémentation pour les méthodes présentées dans cette rubrique. Il est donc inutile, mais sans conséquence, d'ajouter un appel à l'implémentation de la classe de base à votre propre implémentation de la méthode.
Pour plus d'informations sur l'utilisation des méthodes et des propriétés de ces classes dans un type de composant Script particulier, consultez la section Exemples supplémentaires du composant Script. Les rubriques d'exemples contiennent également des exemples de code complets.
Méthode AcquireConnections
Généralement, les sources et les destinations doivent se connecter à une source de données externe. Substituez la méthode AcquireConnections de la classe de base ScriptComponent pour extraire la connexion ou les informations de connexion du gestionnaire de connexions approprié.
L'exemple suivant retourne System.Data.SqlClient.SqlConnection à partir d'un gestionnaire de connexions ADO.NET.
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
L'exemple suivant retourne un chemin d'accès complet et un nom de fichier à partir d'un gestionnaire de connexions de fichiers plats, puis ouvre le fichier à l'aide de 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
Méthode PreExecute
Substituez la méthode PreExecute de la classe de base ScriptComponent lorsque vous devez effectuer un traitement une seule fois avant d'entamer le traitement des lignes de données. Par exemple, dans une destination, vous pouvez configurer la commande paramétrable que la destination utilise pour insérer chaque ligne de données dans la source de données.
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);
}
Traitement des entrées et des sorties
Traitement des entrées
Les composants Script configurés en tant que transformations ou destinations possèdent une entrée.
Composants fournis par l'élément de projet BufferWrapper
Pour chaque entrée configurée, l'élément de projet BufferWrapper contient une classe qui dérive de ScriptBuffer et qui porte le même nom que l'entrée. Chaque classe de mémoire tampon d'entrée contient les propriétés, fonctions et méthodes suivantes :
Des propriétés d'accesseur typées et nommées pour chaque colonne d'entrée sélectionnée. Ces propriétés sont en lecture seule ou en lecture/écriture selon le Type d'utilisation spécifié pour la colonne dans la page Colonnes d'entrée de l'Éditeur de transformation de script.
Une propriété <column>_IsNull pour chaque colonne d'entrée sélectionnée. Cette propriété est également en lecture seule ou en lecture/écriture selon le Type d'utilisation spécifié pour la colonne.
Une méthode DirectRowTo<outputbuffer> pour chaque sortie configurée. Vous utilisez ces méthodes lorsque vous filtrez des lignes vers l'une des multiples sorties dans le même ExclusionGroup.
Une fonction NextRow pour récupérer la ligne d'entrée suivante et une fonction EndOfRowset pour déterminer si la dernière mémoire tampon de données a été traitée. Généralement, vous n'avez pas besoin de ces fonctions lorsque vous exécutez les méthodes de traitement d'entrée implémentées dans la classe de base UserComponent. La section suivante fournit des informations supplémentaires sur la classe de base UserComponent.
Composants fournis par l'élément de projet ComponentWrapper
L'élément de projet ComponentWrapper contient une classe nommée UserComponent dérivée de ScriptComponent. La classe ScriptMain dans laquelle vous écrivez votre code personnalisé dérive à son tour de UserComponent. La classe UserComponent contient les méthodes suivantes :
Une implémentation substituée de la méthode ProcessInput. Il s'agit de la méthode que le moteur de flux de données appelle au moment de l'exécution, juste après la méthode PreExecute. Elle peut être appelée plusieurs fois. ProcessInput fait appel à la méthode <inputbuffer>_ProcessInput pour effectuer le traitement. La méthode ProcessInput recherche ensuite la fin de la mémoire tampon d'entrée et si elle la trouve, appelle la méthode FinishOutputs substituable et la méthode MarkOutputsAsFinished privée. Puis, la méthode MarkOutputsAsFinished appelle SetEndOfRowset sur la dernière mémoire tampon de sortie.
Une implémentation substituable de la méthode <inputbuffer>_ProcessInput. Cette implémentation par défaut parcourt simplement chaque ligne d'entrée et appelle <inputbuffer>_ProcessInputRow.
Une implémentation substituable de la méthode <inputbuffer>_ProcessInputRow. L'implémentation par défaut est vide. Il s'agit normalement de la méthode que vous devez substituer pour écrire votre code de traitement de données personnalisé.
Opérations à effectuer par votre code personnalisé
Vous pouvez utiliser les méthodes suivantes pour traiter l'entrée dans la classe ScriptMain :
Substituez <inputbuffer>_ProcessInputRow pour traiter les données dans chaque ligne d'entrée lors de leur transfert.
Substituez <inputbuffer>_ProcessInput uniquement si vous devez effectuer une autre opération pendant que vous parcourez les lignes d'entrée, (par exemple, lorsque vous devez vérifier si EndOfRowset exécute une autre action une fois que toutes les lignes ont été traitées). Appelez <inputbuffer>_ProcessInputRow pour effectuer le traitement des lignes.
Substituez FinishOutputs si vous devez effectuer une opération sur les sorties avant leur fermeture.
La méthode ProcessInput garantit que ces méthodes sont appelées aux moments appropriés.
Traitement des sorties
Les composants Script configurés en tant que sources ou transformations possèdent une ou plusieurs sorties.
Composants fournis par l'élément de projet BufferWrapper
Pour chaque sortie configurée, l'élément de projet BufferWrapper contient une classe qui dérive de ScriptBuffer et qui porte le même nom que la sortie. Chaque classe de mémoire tampon d'entrée contient les propriétés et méthodes suivantes :
Des propriétés d'accesseur nommées, typées et en écriture seule pour chaque colonne de sortie.
Une propriété <column>_IsNull en écriture seule pour chaque colonne de sortie sélectionnée qui vous permet d'affecter la valeur null à la valeur de colonne.
Une méthode AddRow pour ajouter une ligne vide à la mémoire tampon de sortie.
Une méthode SetEndOfRowset pour indiquer au moteur de flux de données qu'aucune mémoire tampon de données supplémentaires n'est attendue. Il existe également une fonction EndOfRowset pour déterminer si la mémoire tampon active est la dernière mémoire tampon de données. Généralement, vous n'avez pas besoin de ces fonctions lorsque vous exécutez les méthodes de traitement d'entrée implémentées dans la classe de base UserComponent.
Composants fournis par l'élément de projet ComponentWrapper
L'élément de projet ComponentWrapper contient une classe nommée UserComponent dérivée de ScriptComponent. La classe ScriptMain dans laquelle vous écrivez votre code personnalisé dérive à son tour de UserComponent. La classe UserComponent contient les méthodes suivantes :
Une implémentation substituée de la méthode PrimeOutput. Le moteur de flux de données appelle cette méthode avant ProcessInput au moment de l'exécution. La méthode est appelée une seule fois. PrimeOutput fait appel à la méthode CreateNewOutputRows pour effectuer le traitement. Puis, si le composant est une source (autrement dit, le composant ne possède pas d'entrée), PrimeOutput appelle la méthode FinishOutputs substituable et la méthode MarkOutputsAsFinished privée. La méthode MarkOutputsAsFinished appelle SetEndOfRowset sur la dernière mémoire tampon de sortie.
Une implémentation substituable de la méthode CreateNewOutputRows. L'implémentation par défaut est vide. Il s'agit normalement de la méthode que vous devez substituer pour écrire votre code de traitement de données personnalisé.
Opérations à effectuer par votre code personnalisé
Vous pouvez utiliser les méthodes suivantes pour traiter les sorties dans la classe ScriptMain :
Substituez CreateNewOutputRows uniquement lorsque vous pouvez ajouter et remplir des lignes de sortie avant de traiter des lignes d'entrée. Par exemple, vous pouvez utiliser CreateNewOutputRows dans une source, mais dans une transformation à sorties asynchrones, vous devez appeler AddRow pendant ou après le traitement des données d'entrée.
Substituez FinishOutputs si vous devez effectuer une opération sur les sorties avant leur fermeture.
La méthode PrimeOutput garantit que ces méthodes sont appelées aux moments appropriés.
Méthode PostExecute
Substituez la méthode PostExecute de la classe de base ScriptComponent lorsque vous devez effectuer un traitement une seule fois après avoir traité les lignes de données. Par exemple, dans une source, vous pouvez fermer System.Data.SqlClient.SqlDataReader qui vous a permis de charger des données dans le flux de données.
Important
La collection de ReadWriteVariables est uniquement disponible dans la méthode PostExecute. Par conséquent, vous ne pouvez pas incrémenter directement la valeur d'une variable de package à mesure que vous traitez chaque ligne de données. Incrémentez plutôt la valeur d'une variable locale, puis attribuez à la variable de package la valeur de la variable locale dans la méthode PostExecute une fois que toutes les données ont été traitées.
Méthode ReleaseConnections
Généralement, les sources et les destinations doivent se connecter à une source de données externe. Substituez la méthode ReleaseConnections de la classe de base ScriptComponent pour fermer et libérer la connexion que vous avez ouverte précédemment dans la méthode AcquireConnections.
Dim connMgr As IDTSConnectionManager100
...
Public Overrides Sub ReleaseConnections()
connMgr.ReleaseConnection(sqlConn)
End Sub
IDTSConnectionManager100 connMgr;
public override void ReleaseConnections()
{
connMgr.ReleaseConnection(sqlConn);
}
|