| « SSIS API #3 : ConnectionManager & OLE DB Source | API SSIS #1 : Export Dynamique & analyse des dépendances » |
SSIS API #2 : Objets Package & TaskHost
Commençons par les basiques. La première étape consiste tout simplement à créer un objet package et à lui ajouter :
- Un data flow (objet pipeline)
- Un connection Manager qui contiendra la définition de notre base
et à le sauvegarder.
Je crée donc une classe Export :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using runtime = Microsoft.SqlServer.Dts.Runtime;
using runtimeWrapper = Microsoft.SqlServer.Dts.Runtime.Wrapper;
using wrapper = Microsoft.SqlServer.Dts.Pipeline.Wrapper;
namespace BILAB.Technical.History.PackageBuilder
{
public class MulticastExport
{
private runtime.Package _p;
private runtime.TaskHost _taskhost;
private wrapper.MainPipe _mainpipe;
A noter les 3 imports:
- Un runtime qui représente le moteur SSIS
- RuntimeWrapper "masque" les objets (COM) sous jacents
- et enfin wrapper est le wrapper des composants du dataflow (pipeline)
La methode Export sera celle appelée par notre client :
public void Export()
{
_p = new runtime.Package();
_p.Name = "MulticastExport";
_p.CreatorComputerName = System.Environment.MachineName;
_p.CreatorName = System.Environment.UserName;
this.addDataflow();
this.addSourceCM();
//this.addSourceConnection();
//this.addMulticast();
//this.addPdtSource();
//this.addSort();
//this.addMerge();
//this.addFactDestination();
runtime.Application a = new Microsoft.SqlServer.Dts.Runtime.Application();
a.SaveToXml("ZBILAB.History.dtsx", _p, null);
}
Comme vous pouvez le voir, cette méthode va créer le package _p, ajouter le dataflow, la connection et enfin sauvegarder le package via un objet Application qui représente le runtime (le troisième paramètre à null sera utilisé pour gérer les évènements)
Ajout du DataFlow :
private void addDataflow()
{
/*
* Common properties of taskhost
* ms-help://MS.VSCC.v90/MS.VSIPCC.v90/MS.SQLSVR.v10.en/s10is_1devconc/html/1b725922-ec59-4a47-9d55-e079463058f3.htm
*
* Detail :
* ms-help://MS.VSCC.v90/MS.VSIPCC.v90/MS.SQLSVR.v10.en/s10is_7ismrf/html/e39480e5-613f-4bf4-87b1-249942ed9a35.htm
*/
/* Add Method
* ms-help://MS.VSCC.v90/MS.VSIPCC.v90/MS.SQLSVR.v10.en/s10is_7ismrf/html/a0d4c1cf-d4a3-4297-8892-7b13f235fe9d.htm
*
*/
_taskhost = (runtime.TaskHost)_p.Executables.Add("DTS.Pipeline");
_taskhost.Name = "DFT History";
_mainpipe = (wrapper.MainPipe)_taskhost.InnerObject;
// Another example of taskhost creation
//runtime.Executable e = _p.Executables.Add("Microsoft.SqlServer.Dts.Tasks.BulkInsertTask.BulkInsertTask, Microsoft.SqlServer.BulkInsertTask, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91");
//runtime.TaskHost t = (runtime.TaskHost)e;
//t.Name = "REH";
}
Ajouter un DataFlow consiste à ajouter un objet dit Executable. Les Executable sont respectivements :
- les itérateurs for
- les séquences
- les dataflow / TaskHost
Vous trouverez l'architecture des composants sur :
=> http://msdn.microsoft.com/en-us/library/ms137681.aspx
Ces objets ont des propriétés communes
==> http://msdn.microsoft.com/en-us/library/ms137728.aspx
Dans la pratique, nous ajoutons une tâche en faisant référence à son CLSID (vue base de registre) comme dans notre exemple :
mais cela peut être aussi par les assemblies comme l'exemple (en commentaire) du bulk insert .
Pour finir, nous récupérons la classe hébergée et instanciée dans le taskhost via _taskhost.InnerObject