Renaud Harduin
Développement de composant Integration Services (SSIS)
Par Renaud Harduin publié le 08/01/2006 à 14:16, lu 7555 fois, 6 pages
 2 | 2 - Noyau du « XmlDestinationAdapter »
Téléchargez le code source - 263 Kb
2 - Noyau du « XmlDestinationAdapter »
2.1 – Descriptif
L'idée est de générer dynamiquement un fichier XML a partir d'une source en amont de notre composant en s'appuyant sur un modèle de type Datarow (un élément de type DataRow par ligne; plus un dernier élément optionnel représentant le nombre de lignes portées dans le message)
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<XmlDestination>
  <DataRow>
    <ProductKey>352</ProductKey>
    <CustomerKey>12232</CustomerKey>
    <Freight>51,7855</Freight>
    <CarrierTrackingNumber />
    <CustomerPONumber />
  </DataRow>
  <DataRow>
    <ProductKey>482</ProductKey>
    <CustomerKey>17628</CustomerKey>
    <Freight>0,2248</Freight>
    <CarrierTrackingNumber />
    <CustomerPONumber />
  </DataRow>
  <DataRow>
    <ProductKey>596</ProductKey>
    <CustomerKey>12763</CustomerKey>
    <Freight>13,4998</Freight>
    <CarrierTrackingNumber />
    <CustomerPONumber />
  </DataRow>
<XmlDestination>
On admettra que les noms de colonnes seront celles des colonnes en input et que le tag « root » (<XmlDestination />), le tag DataRow (<DataRow />) le tag nombre de lignes (<NumberOfRows/>) devront être paramétrables (au travers d'un interface graphique par exemple).
2.2 – Structure de base
Les composants doivent dériver de la classe PipelineComponent (ns: Microsoft.SqlServer.Dts.Pipeline, sous “C:\Program Files\microsoft sql server\90\SDK\Assemblies\ Microsoft.SqlServer.PipelineHost.dll”). Sur cette base, nous devrons surcharger 5 méthodes remarquables:
  1. ProvideComponentProperties
  2. Validate
  3. PreExcute
  4. ProcessInput
  5. PostExecute
La « prototype » du composant est de la forme :
using System;
using System.Collections.Generic;
using System.Text;

using System.Collections;
using System.Diagnostics;
using System.Xml;

/* ce namespace contient des classes utilitaires pour la gestion de l'objet */
/* vous le retrouver dans l'archive de l'article */
using BILab.Technical.ETL.Pipeline.Common;

using Microsoft.SqlServer.Dts.Pipeline;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;

using Microsoft.SqlServer.Dts.Runtime;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

[DtsPipelineComponent(
ComponentType=ComponentType.DestinationAdapter,
DisplayName="XML Destination Adapter",
UITypeName = 
    "BILab.Technical.ETL.Pipeline.XmlDestination.XmlDestinationAdapterUI,
    XmlDestination,
    Version=1.0.0.0,
    Culture=neutral,
    PublicKeyToken=e4e8dcd3244436f2"
)
]
public class XmlDestinationAdapter : PipelineComponent
{
      // Methods
      public XmlDestinationAdapter();

      public override void ProvideComponentProperties();

      public override DTSValidationStatus Validate();


      public override void PreExecute();
      public override void PostExecute();
      public override void ProcessInput(int inputID, PipelineBuffer buffer);

      // Properties
      public bool DoOutputNumberOfRows { get; set; }
      private string FileName { get; set; }
      private int LineCounter { get; set; }
      private XmlWriter Xml { get; set; }
      private string Xml_NbOfRowsTag { get; set; }
      private string Xml_RootTag { get; set; }
      private string Xml_RowTag { get; set; }

      // Fields
      private bool _doOutputNumberOfRows;
      private string _fileName;
      private int _lineCounter;
      private XmlWriter _xml;
      private string _Xml_NbOfRowsTag;
      private string _Xml_RootTag;
      private string _Xml_RowTag;
      private ColumnInformation[] colInfos;
      private const string Const_FileName_AttributeName = "Filename";
      private const string Const_OutputNbOfRows_AttributeName = "Output Number Of Rows";
      private const string Const_XmlNbOfRowsTag_AttributeName = "Xml Number of Rows Tag";
      private const string Const_XmlRootTag_AttributeName = "Xml Root Tag";
      private const string Const_XmlRowTag_AttributeName = "Xml Row Tag";
}

Notre classe XmlDestinationAdapter est marquée d'un attribut DtsPipelineComponent (ns : Microsoft.SqlServer.Dts.Pipeline) qui permet d'indiquer qu'il s'agit d'un composant de DataFlow (pour un composant ControlFlow on utilisera l'attribut DtsTask).
Cet attribut permet de spécifier notamment :
  • ComponentType = la nature du composant qui peut être
  1. DestinationAdapter : un pipeline dont la nature est d'écrire dans une destination (ie hors SSIS)
  2. SourceAdapter : en charge de la lecture d'une source externe
  3. Transform : En charge de traiter les Buffers de données en input pour produire 1 à N output transformés (ou non).
  • UITypeName : une classe qui implémente IDtsComponentUI, qui va permettre de lier les propriétés du composant avec un Form (ceci étant optionnel dans la mesure où l'on dispose d'un éditeur par défaut qui prend toutes les propriétés en charge).
 
» Démarrer une discussion
 
Discussion démarée par dystopy le 18/07/2007 à 10:52, 2 commentaire(s).