Création d'une destination à l'aide du composant Script

S’applique à :SQL Server SSIS Integration Runtime dans Azure Data Factory

Les composants de destination dans le flux de données d'un package Integration Services permettent d'enregistrer des données provenant de sources et de transformations en amont dans une source de données. En principe, le composant de destination se connecte à la source de données via un gestionnaire de connexions existant.

Pour une vue d’ensemble du composant Script, consultez Extension du flux de données avec le composant Script.

Le composant Script et le code d'infrastructure qu'il génère simplifient considérablement le processus qui consiste à développer un composant de flux de données personnalisé. Toutefois, pour comprendre le fonctionnement du composant Script, il peut être utile de lire les étapes permettant de développer des composants de flux de données personnalisés dans la section Développement d’un composant de flux de données personnalisé et plus particulièrement Développement d’un composant de destination personnalisé.

Mise en route d'un composant de destination

Lorsque vous ajoutez un composant Script à l’onglet Flux de données du concepteur SSIS, la boîte de dialogue Sélectionner le type de composant de script s’ouvre et vous invite à sélectionner un script de type Source, Destination ou Transformation. Dans cette boîte de dialogue, sélectionnez Destination.

Ensuite, connectez la sortie d'une transformation au composant de destination dans le concepteur SSIS. À des fins de test, vous pouvez connecter directement une source à une destination sans transformation.

Configuration d'un composant de destination en mode Création de métadonnées

Après avoir sélectionné l’option de création d’un composant de destination, configurez le composant dans l’Éditeur de transformation de script. Pour plus d’informations, consultez Configuration du composant Script dans l’éditeur de composant de script.

Pour sélectionner le langage de script qui sera utilisé par le composant Script, vous devez définir la propriété ScriptLanguage dans la page Script de la boîte de dialogue Éditeur de transformation de script.

Notes

Pour définir le langage de script par défaut du composant Script, utilisez l’option Langage de script dans la page Général de la boîte de dialogue Options. Pour plus d'informations, consultez General Page.

Un composant de destination de flux de données possède une entrée et aucune sortie. La configuration de l’entrée du composant est l’une des étapes à exécuter en mode Création des métadonnées, à l’aide de l’Éditeur de transformation de script, avant d’écrire le script personnalisé.

Ajout de gestionnaires de connexions

En principe, une composant de destination utilise un gestionnaire de connexions existant pour se connecter à la source de données dans laquelle il enregistre les données du flux de données. Dans la page Gestionnaires de connexions de l' Éditeur de transformation de script, cliquez sur Ajouter pour ajouter le gestionnaire de connexions approprié.

Toutefois, un gestionnaire de connexions n'est qu'une unité pratique qui permet d'encapsuler et de stocker les informations requises pour se connecter à une source de données d'un type particulier. Vous devez écrire votre propre code personnalisé pour charger ou enregistrer vos données et éventuellement ouvrir et fermer la connexion à la source de données.

Pour obtenir des informations générales sur l’utilisation des gestionnaires de connexions avec le composant Script, consultez Connexion aux sources de données dans le composant Script.

Pour plus d’informations sur la page Gestionnaires de connexions de l’Éditeur de transformation de script, consultez Éditeur de transformation de script (page Gestionnaires de connexions).

Configuration d'entrées et de colonnes d'entrée

Un composant de destination possède une entrée et aucune sortie.

Dans la page Colonnes d’entrée de l’Éditeur de transformation de script, la liste des colonnes affiche les colonnes disponibles dans la sortie du composant en amont du flux de données. Sélectionnez les colonnes à enregistrer.

Pour plus d’informations sur la page Colonnes d’entrée de l’Éditeur de transformation de script, consultez Éditeur de transformation de script (page Colonnes d’entrée).

La page Entrées et sorties de l’Éditeur de transformation de script affiche une seule entrée que vous pouvez renommer. La propriété d'accesseur créée dans le code généré automatiquement vous permet de référencer l'entrée dans le script par son nom.

Pour plus d’informations sur la page Entrées et sorties de l’Éditeur de transformation de script, consultez Éditeur de transformation de script (page Entrées et sorties).

Ajout de variables

Si vous voulez utiliser des variables existantes dans votre script, vous pouvez les ajouter dans les champs de propriété ReadOnlyVariables et ReadWriteVariables de la page Script de l’Éditeur de transformation de script.

Lorsque vous ajoutez plusieurs variables dans les champs de propriété, séparez les noms de variables par des virgules. Vous pouvez également sélectionner plusieurs variables en cliquant sur le bouton de sélection ( ... ) en regard des champs de propriété ReadOnlyVariables et ReadWriteVariables, puis en sélectionnant les variables dans la boîte de dialogue Sélectionner des variables.

Pour obtenir des informations générales sur l’utilisation de variables avec le composant Script, consultez Utilisation de variables dans le composant Script.

Pour plus d’informations sur la page Script de l’Éditeur de transformation de script, consultez Éditeur de transformation de script (page Script).

Script d'un composant de destination en mode Création de code

Après avoir configuré les métadonnées du composant, vous pouvez écrire votre script personnalisé. Dans l’Éditeur de transformation de script, dans la page Script, cliquez sur Modifier le script pour ouvrir l’environnement de développement intégré Microsoft Visual Studio Tools for Applications (VSTA) où vous pouvez ajouter votre script personnalisé. Le langage de script utilisé varie selon que vous avez sélectionné Microsoft Visual Basic ou Microsoft Visual C# comme langage de script pour la propriété ScriptLanguage dans la page Script.

Pour obtenir des informations importantes concernant tous les types de composants créés à l’aide du composant Script, consultez Codage et débogage du composant Script.

Fonctionnement du code généré automatiquement

Lorsque vous ouvrez l’environnement de développement intégré VSTA après avoir créé et configuré un composant de destination, la classe ScriptMain modifiable apparaît dans l’éditeur de code avec un stub pour la méthode ProcessInputRow. La classe ScriptMain est l’emplacement où vous allez écrire votre code personnalisé et ProcessInputRow est la méthode la plus importante d’un composant de destination.

Si vous ouvrez la fenêtre Explorateur de projets dans VSTA, vous constatez que le composant Script a également généré des éléments de projet BufferWrapper et ComponentWrapper en lecture seule. La classe ScriptMain hérite de la classe UserComponent dans l'élément de projet ComponentWrapper .

Au moment de l’exécution, le moteur de flux de données appelle la méthode ProcessInput dans la classe UserComponent, qui remplace la méthode ProcessInput de la classe parente ScriptComponent. La méthode ProcessInput parcourt à son tour les lignes du tampon d’entrée et appelle la méthode ProcessInputRow une fois pour chaque ligne.

Écriture du code personnalisé

Pour terminer la création d’un composant de destination personnalisé, vous pouvez écrire le script dans les méthodes suivantes disponibles dans la classe ScriptMain.

  1. Substituez la méthode AcquireConnections pour vous connecter à la source de données externe. Extrayez l'objet de connexion, ou les informations de connexion requises, du gestionnaire de connexions.

  2. Remplacez la méthode PreExecute pour préparer l’enregistrement des données. Par exemple, vous pouvez créer et configurer un objet SqlCommand et ses paramètres dans cette méthode.

  3. Utilisez la méthode ProcessInputRow remplacée pour copier chaque ligne d’entrée dans la source de données externe. Par exemple, pour une destination SQL Server, vous pouvez copier les valeurs de colonne dans les paramètres d’un objet SqlCommand et exécuter la commande une fois pour chaque ligne. Pour une destination de fichier plat, vous pouvez écrire les valeurs de chaque colonne dans un objet StreamWriter, en séparant les valeurs par le délimiteur de colonne.

  4. Remplacez la méthode PostExecute pour vous déconnecter de la source de données externe, le cas échéant, et pour effectuer toute autre opération de nettoyage nécessaire.

Exemples

Les exemples suivants présentent le code requis dans la classe ScriptMain pour créer un composant de destination.

Notes

Ces exemples utilisent la table Person.Address de l’exemple de base de données AdventureWorks et passent ses première et quatrième colonnes (à savoir les colonnes intAddressID et nvarchar(30)City) dans le flux de données. Les mêmes données sont utilisées dans les exemples de source, transformation et destination de cette section. Des conditions préalables et des hypothèses supplémentaires sont documentées pour chaque exemple.

Exemple de destination ADO.NET

Cet exemple montre un composant de destination qui utilise un gestionnaire de connexions ADO.NET existant pour enregistrer des données du flux de données dans une table SQL Server.

Si vous souhaitez exécuter cet exemple de code, vous devez configurer le package et le composant comme suit :

  1. Créez un gestionnaire de connexions ADO.NET qui utilise le fournisseur SqlClient pour se connecter à la base de données AdventureWorks.

  2. Créez une table de destination en exécutant la commande Transact-SQL suivante dans la base de données AdventureWorks :

    CREATE TABLE [Person].[Address2]([AddressID] [int] NOT NULL,  
        [City] [nvarchar](30) NOT NULL)  
    
  3. Ajoutez un nouveau composant Script à l'aire du concepteur de flux de données et configurez-le en tant que destination.

  4. Connectez la sortie d'une source ou transformation en amont au composant de destination dans le concepteur SSIS. (Vous pouvez connecter directement une source à une destination sans transformation.) Cette sortie doit fournir les données de la table Person.Address de l’exemple de base de données AdventureWorks qui contient au moins les colonnes AddressID et City.

  5. Ouvrez l' Éditeur de transformation de script. Dans la page Colonnes d’entrée, sélectionnez les colonnes d’entrée AddressID et City.

  6. Dans la page Entrées et sorties, renommez l’entrée en lui attribuant un nom plus descriptif, comme MyAddressInput.

  7. Dans la page Gestionnaires de connexions, ajoutez ou créez le gestionnaire de connexions ADO.NET et attribuez-lui un nom, par exemple MyADONETConnectionManager.

  8. Dans la page Script , cliquez sur Modifier le script , puis entrez le script suivant. Ensuite, fermez l'environnement de développement de script.

  9. Fermez l’Éditeur de transformation de script et exécutez l’exemple.

Imports System.Data.SqlClient  
...  
Public Class ScriptMain  
    Inherits UserComponent  
  
    Dim connMgr As IDTSConnectionManager100  
    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  
using System.Data.SqlClient;  
public class ScriptMain:  
    UserComponent  
  
{  
    IDTSConnectionManager100 connMgr;  
    SqlConnection sqlConn;  
    SqlCommand sqlCmd;  
    SqlParameter sqlParam;  
  
    public override void AcquireConnections(object Transaction)  
    {  
  
        connMgr = this.Connections.MyADONETConnectionManager;  
        sqlConn = (SqlConnection)connMgr.AcquireConnection(null);  
  
    }  
  
    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);  
  
    }  
  
    public override void MyAddressInput_ProcessInputRow(MyAddressInputBuffer Row)  
    {  
        {  
            sqlCmd.Parameters["@addressid"].Value = Row.AddressID;  
            sqlCmd.Parameters["@city"].Value = Row.City;  
            sqlCmd.ExecuteNonQuery();  
        }  
    }  
  
    public override void ReleaseConnections()  
    {  
  
        connMgr.ReleaseConnection(sqlConn);  
  
    }  
  
}  

Exemple de destination de fichier plat

Cet exemple montre un composant de destination qui utilise un gestionnaire de connexions de fichiers plats existant pour enregistrer des données du flux de données dans un fichier plat.

Si vous souhaitez exécuter cet exemple de code, vous devez configurer le package et le composant comme suit :

  1. Créez un gestionnaire de connexions de fichiers plats qui se connecte à un fichier de destination. Si le fichier n'existe pas, le composant de destination le crée. Configurez le fichier de destination en tant que fichier délimité par des virgules qui contient les colonnes AddressID et City.

  2. Ajoutez un nouveau composant Script à l'aire du concepteur de flux de données et configurez-le en tant que destination.

  3. Connectez la sortie d'une source ou transformation en amont au composant de destination dans le concepteur SSIS. (Vous pouvez connecter directement une source à une destination sans transformation.) Cette sortie doit fournir les données de la table Person.Address de l’exemple de base de données AdventureWorks et contenir au moins les colonnes AddressID et City.

  4. Ouvrez l' Éditeur de transformation de script. Dans la page Colonnes d’entrée, sélectionnez les colonnes AddressID et City.

  5. Dans la page Entrées et sorties, renommez l’entrée en lui attribuant un nom plus descriptif, comme MyAddressInput.

  6. Dans la page Gestionnaires de connexions, ajoutez ou créez le gestionnaire de connexions de fichiers plats et attribuez-lui un nom descriptif, par exemple MyFlatFileDestConnectionManager.

  7. Dans la page Script , cliquez sur Modifier le script , puis entrez le script suivant. Ensuite, fermez l'environnement de développement de script.

  8. Fermez l’Éditeur de transformation de script et exécutez l’exemple.

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 IDTSConnectionManager100 = _  
            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  
using System.IO;  
public class ScriptMain:  
    UserComponent  
  
{  
    string copiedAddressFile;  
    private StreamWriter textWriter;  
    private string columnDelimiter = ",";  
  
    public override void AcquireConnections(object Transaction)  
    {  
  
        IDTSConnectionManager100 connMgr = this.Connections.MyFlatFileDestConnectionManager;  
        copiedAddressFile = (string) connMgr.AcquireConnection(null);  
  
    }  
  
    public override void PreExecute()  
    {  
  
        textWriter = new StreamWriter(copiedAddressFile, false);  
  
    }  
  
    public override void MyAddressInput_ProcessInputRow(MyAddressInputBuffer Row)  
    {  
  
        {  
            if (!Row.AddressID_IsNull)  
            {  
                textWriter.Write(Row.AddressID);  
            }  
            textWriter.Write(columnDelimiter);  
            if (!Row.City_IsNull)  
            {  
                textWriter.Write(Row.City);  
            }  
            textWriter.WriteLine();  
        }  
  
    }  
  
    public override void PostExecute()  
    {  
  
        textWriter.Close();  
  
    }  
  
}  

Voir aussi

Création d'une source à l'aide du composant Script
Développement d'un composant de destination personnalisé