Nouvelles Chroniques d'Amethyste

Penser au Sens, pas au Verbe

Lancer un script SSIS

Poster un commentaire

Sur mon projet j’ai un peut ramé pour faire un truc tout simple: lancer un script SSIS depuis du code C#.

Il existe un SDK: Microsoft.SqlServer.Dts.Runtime

l’exécution se passe bien, c’est facile de passer les paramètres du script… mais je n’ai jamais réussi à récupérer les logs!

Vous trouverez une exemple ici:

http://www.codeproject.com/Tips/658959/Execute-SSIS-Packge-by-using-Csharp-and-SQL-Server

 

Alors je me suis lancé dans l’exécution d’un process avec dtexec.exe et là… on se heurte à la syntaxe pour passer les paramètres. Du bonheur!!!!!

D’où l’intérêt de cet article.

Je commence par créer une bête classe POCO appelée SsisVariables qui contiendra les valeurs de tous les paramètres que je dois passer au script. Pour me faciliter la vie, le nom des propriétés coïncide avec celui des paramètres du script.

 

Ensuite on construit la méthode qui va générer la syntaxe de passage des paramètres:

private string ExtractCmd(string packageName, SsisVariables variables)
{
   string head = @" /FILE ""{0}"" /CHECKPOINTING OFF /REPORTING V {1}";
   string modele = @" /SET \Package.variables[{0}].Value;""\""{1}\"""" ";
 
   StringBuilder sb = new StringBuilder();
   sb.AppendFormat(modele, nameof(variables.MainStepIndex), variables.MainStepIndex);
   sb.AppendFormat(modele, nameof(variables.CorrelationId), variables.CorrelationId);
   sb.AppendFormat(modele, nameof(variables.SQLConnectionString), variables.SQLConnectionString);
 
   string cmd = string.Format(head, packageName, sb.ToString());
   return cmd;
}

Je vous laisse admirer la tête du template, ça fait rêver hein?

Avec ce réglage le logs est émit en mode Verbose. Mais il y a d’autres possibilités.

 

Bien entendu dans votre cas les propriétés seront sans doute différentes, on peut aussi ajouter de la réflexion pour automatiser la recherche des propriétés de SsisVariables.

 

Reste à voir comment lancer le script et récupérer les logs SSIS lorsqu’une exception se produit.

 

public int Process(string packageName, SsisVariables variables)
{
   sb = new StringBuilder();
 
   string cmd = ExtractCmd(packageName, variables);
 
   using (Process process = new Process())
   {
      process.StartInfo.FileName = "dtexec";
      process.StartInfo.CreateNoWindow = true;
      process.StartInfo.UseShellExecute = false;
      process.StartInfo.Arguments = cmd;
      process.StartInfo.RedirectStandardOutput = true;
      process.StartInfo.CreateNoWindow = true;
      process.StartInfo.ErrorDialog = false;
 
      process.Start();
 
      process.OutputDataReceived += Process_OutputDataReceived;
      process.BeginOutputReadLine();
 
      process.WaitForExit(900000); // 15 minutes
 
      return process.ExitCode;
   }
}

 

Dtexec est SSIS en ligne de commande qu’il faudra installer. Il est par défaut si le serveur dispose d’une instance de SQL.

A vous de régler la durée max d’exécution du script, je crois honnêtement qu’il faut une valeur.

La ligne intéressante est la ligne 19 puisqu’elle déclare un gestionnaire d’événements qui sera appelé à chaque ligne de log émise par le script.


private void Process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
   sb.AppendLine(e.Data);
}

 

Le StringBuilder sb contiendra le log à la fin du processus si le code de sortie est différent de 0. Si une erreur est levée on peut s’attendre aux codes de sortie suivants:

1: Package failed

3: Canceled by user

4: can’t find package

5: can’t load package

6: Internal error or syntax error in the command line

 

Il ne semble pas (plus?) y avoir de valeur 2.

 

J’aime bien compléter le log avec des infos comme:

  • le code de retour
  • la ligne de commande

Dans le cas de la ligne de commande il est important d’anonymiser les éventuelles valeurs critiques comme les mots de passe, pensez-y. SsisVariable est alimenté par une méthode spécialisée qui attend un paramètre demandant d’anonymiser les valeurs sensibles. c’est très pratique de centraliser les choses et ne pas bricoler avec des Regex.

 

Publicités

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