[SSIS] XML Destination avec un script

Vous le savez sûrement, il n’existe pas de XML destination en SSIS. Pour une raison imaginable: la gestion du formatage de sortie et de la DTD à utiliser aurait donné un composant probablement trop complexe à coder et à utiliser.

Pour des usages simples, on peut en revanche coder son implémentation de ce type de provider, en utilisant un ScriptDestination et un tout bête StreamWriter à noter que l’on peut aussi utiliser l’API XML, en particulier son XMLWriter.
J’ai codé celle-ci: elle est très basique et sûrement éminemment perfectible. Mais elle m’a servi plus d’une fois.

On commence déjà par par définir quatre variables globales: le nom du fichier, un StreamWriter .NET et les noms des noeuds racine et tuple.

public class ScriptMain : UserComponent
{
string fichier = @ »C:\fichier.xml » ;
StreamWriter xml = null;
string racine = « Employees » ;
string tuple = « Employee » ;

Ensuite ce genre de script comprend 3 méthodes à implémenter:

  1. PreExecute, qui s’exécute une fois au début, on va y écrire le header
  2. ProcessInputRow qui s’exécute pour chaque ligne: on va écrire chaque ligne
  3. PostExecute où on va écrire le footer sur le modèle de PreExecute

PreExecute

Au début, on insère la Node racine sous forme de node XML ouvrante.

public override void PreExecute()
{
xml = new StreamWriter(fichier, false);
xml.WriteLine(« <"+racine+« > »);

}

PostExecute

A la fin, on insère la Node racine sous forme de node XML fermante, et on ferme le handle sur le StreamWriter.

public override void PostExecute()
{
xml.WriteLine(« </"+racine+« > »);
xml.Close();

}

ProcessInputRow

Le plus intéressant est ici: pour chaque ligne on inscrit:

  • En ouvrant le nom du tuple
  • Puis pour chaque colonne d’entrée dans les métadonnées du composant (interrogé via ComponentMetadata), on récupère son nom que l’on crée en node ouvrante et fermante
  • On insère entre les deux la valeur de cette InputColumn pour le paramètre considéré
  • On ferme l’identifieur du tuple

public override void Input0_ProcessInputRow(Input0Buffer Row)
{

xml.WriteLine(« [« +tuple+« ] »);

foreach(IDTSInputColumn100 c in this.ComponentMetaData.InputCollection[0].InputColumnCollection)
{

string valeur = (string)Row.GetType().GetProperty (c.Name).GetValue(Row, null);
xml.Write(« <" +c.Name+ « > »

+ valeur
+ « 
</ »+c.Name+« >« );
}

xml.WriteLine(« </ » +tuple+ « >« );
}

Voilà, en espérant que cela vous serve dans vos projets. Si vous possédez une meilleure implémentation – je ne suis pas un dieu absolu de C# après tout – n’hésitez pas!

A bientôt!

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s