Composant de script SSIS - Comment modifier le Output0Buffer

10

J'ai un composant de script qui accepte les enregistrements de la table de base de données SQL Azure. Le script appelle ensuite un service Web, qui renvoie le nombre d'enregistrements ayant échoué et réussi.

Pour tous les enregistrements, je voudrais ajouter le champ Statut qui a soit «succès» ou «échec» et cela obtient la sortie du composant de script.

Je connecte ensuite ces résultats dans un fichier texte.

Problème: je ne suis pas en mesure d'ajouter le statut de chaque enregistrement d'entrée, car l'appel de service Web ne se produit que lors de l'exécution.

J'ai essayé mais ça ne marche toujours pas:

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
         listOfData.Add(new ClockData 
         {
             TimeClockID=Row.TimeClockID,
             PersonID=Row.EmployeeCode,
             LocationCode=Row.ClockInServiceContextID,
             ClockInDateTime=Row.ClockInDateTime,
             ClockOutDateTime=Row.ClockOutDateTime

         });
 }

 public override void CreateNewOutputRows()
 {
     MessageBox.Show("Test CreateNewOutputRows");
     MessageBox.Show(listOfData.Count.ToString());
     foreach (var item in listOfData)
     {
         Output0Buffer.AddRow();
         Output0Buffer.EmployeeCode = item.PersonID;
         MessageBox.Show(item.PersonID);
     }
 }
flybyte
la source
1
Pourquoi ne pouvez-vous pas exécuter l'appel de service Web pendant les lignes d'entrée de processus? Toutes les données sont déjà descendues dans le pipeline une fois qu'elles sont sorties de cette méthode. Vous accumulez des données dans votre variable locale, mais à ce stade, c'est comme tenir une photo d'une voiture qui vient de partir - oui, c'est à quoi elle ressemblait mais elle ne revient pas
billinkc
@flybyte: quelque chose d'utile dans ma réponse?
Marian

Réponses:

6

Tout dans une transformation se fait dans Input0_ProcessInputRow La solution serait essentiellement

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
         listOfData.Add(new ClockData 
         {
             TimeClockID=Row.TimeClockID,
             PersonID=Row.EmployeeCode,
             LocationCode=Row.ClockInServiceContextID,
             ClockInDateTime=Row.ClockInDateTime,
             ClockOutDateTime=Row.ClockOutDateTime
         });
         Output0Buffer.AddRow();
         Output0Buffer.EmployeeCode = item.PersonID;
         MessageBox.Show(item.PersonID);
}

Vous pourrez peut-être effectuer les étapes de sortie dans PostExecute, CreateNewOutputRows n'est pas exécuté dans Transformation, uniquement dans les scripts de destination.

JohnDavid
la source
3

Je ne suis pas très compétent en SSIS, mais je pense que vous pourriez essayer les idées suivantes:

  • allez dans le composant de script et éditez-le,
  • allez à la section Entrées et sorties (3e section),
  • allez à Output0 - Colonnes de sortie,
  • ajoutez une nouvelle colonne (donnez-lui un nom et un type, disons Status - booléen).

Ensuite, vous auriez la colonne vide à votre sortie et vous devrez la remplir avec des données pour chacune des lignes d'entrée:

Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
    Row.Status = IIf(String.IsNullOrEmpty(rowValues.GetValue(1).ToString()), 0, 1)

Cela vous aidera à ajouter une colonne Statut à votre tableau de sortie. J'espère que c'est ce que vous vouliez.

Marian
la source