Création d'une destination à l'aide du composant Script
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 obtenir 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é, notamment 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
Une fois que vous avez sélectionné l'option pour créer un composant de destination, l'Éditeur de transformation de script vous permet de configurer le composant. Pour plus d'informations, consultez Configuration du composant Script dans l'éditeur de composant de script.
Pour sélectionner le langage de script que la destination Script doit utiliser, vous devez définir la propriété ScriptLanguage dans la page Script de la boîte de dialogue Éditeur de transformation de script.
[!REMARQUE]
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 Page Général.
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 de 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 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 Gestionnaire 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 à partir de 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 souhaitez utiliser des variables existantes dans votre script, vous pouvez les ajouter dans les champs de propriété ReadOnlyVariables et ReadWriteVariables dans 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é MicrosoftVisual 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 substitue la méthode ProcessInput de la classe parente ScriptComponent. La méthode ProcessInput parcourt à son tour les lignes de la mémoire tampon d'entrée et appelle la méthode ProcessInputRow une fois pour chaque ligne.
Écriture du code personnalisé
Pour terminer de créer un composant de destination personnalisé, vous pouvez écrire le script dans les méthodes suivantes disponibles dans la classe ScriptMain.
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.
Substituez la méthode PreExecute pour vous préparer à enregistrer les données. Par exemple, vous pouvez créer et configurer un SqlCommand et ses paramètres dans cette méthode.
Utilisez la méthode ProcessInputRow substituée pour copier chaque ligne d'entrée vers la source de données externe. Par exemple, pour une destination SQL Server, vous pouvez copier les valeurs de colonne dans les paramètres de 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 StreamWriter, en séparant les valeurs par le délimiteur de colonne.
Substituez 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.
[!REMARQUE]
Ces exemples utilisent la table Person.Address dans l'exemple de base de données AdventureWorks et transfèrent ses première et quatrième colonnes (colonnes int AddressID et nvarchar(30) City) par 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 :
Créez un gestionnaire de connexions ADO.NET qui utilise le fournisseur SqlClient pour se connecter à la base de données AdventureWorks.
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 )
Ajoutez un nouveau composant Script à l'aire du concepteur de flux de données et configurez-le en tant que destination.
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.
Ouvrez l'Éditeur de transformation de script. Dans la page Colonnes d'entrée, sélectionnez les colonnes d'entrée AddressID et City.
Dans la page Entrées et sorties, renommez l'entrée avec un nom plus descriptif, tel que MyAddressInput.
Dans la page Gestionnaires de connexions, ajoutez ou créez le gestionnaire de connexions ADO.NET et attribuez-lui un nom, par exemple MyADONETConnectionManager.
Dans la page Script, cliquez sur Modifier le script, puis entrez le script suivant. Ensuite, fermez l'environnement de développement de script.
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 :
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.
Ajoutez un nouveau composant Script à l'aire du concepteur de flux de données et configurez-le en tant que destination.
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.
Ouvrez l'Éditeur de transformation de script. Dans la page Colonnes d'entrée, sélectionnez les colonnes AddressID et City.
Dans la page Entrées et sorties, renommez l'entrée avec un nom plus descriptif, tel que MyAddressInput.
Dans la page Gestionnaires de connexions, ajoutez ou créez le gestionnaire de connexions de fichiers plats avec un nom descriptif, tel que MyFlatFileDestConnectionManager.
Dans la page Script, cliquez sur Modifier le script, puis entrez le script suivant. Ensuite, fermez l'environnement de développement de script.
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();
}
}
|