SSIS-Skriptkomponente - So ändern Sie den Output0Buffer

10

Ich habe eine Skriptkomponente, die Datensätze aus der SQL Azure-Datenbanktabelle akzeptiert. Das Skript ruft dann einen Webdienst auf, der die Anzahl der fehlgeschlagenen und erfolgreichen Datensätze zurückgibt.

Für alle Datensätze möchte ich das Statusfeld hinzufügen, das entweder "Erfolg" oder "Fehler" hat und das von der Skriptkomponente ausgegeben wird.

Ich logge dann diese Ausgabe in eine Textdatei ein.

Problem: Ich konnte nicht für jeden Eingabedatensatz den Status hinzufügen, da der Webdienstaufruf nur nach der Ausführung erfolgt.

Ich habe es versucht, aber es funktioniert immer noch nicht:

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
quelle
1
Warum können Sie den Webdienstaufruf während der Prozesseinträge nicht ausführen? Alle Daten sind bereits in die Pipeline eingegangen, sobald diese Methode beendet ist. Sie sammeln Daten in Ihrer lokalen Variablen, aber an diesem Punkt ist es, als würden Sie ein Bild von einem Auto halten, das gerade weggefahren ist - ja, so sah es aus, aber es kommt nicht zurück
billinkc
@flybyte: irgendetwas nützliches in meiner Antwort?
Marian

Antworten:

6

Alles in einer Transformation wird in Input0_ProcessInputRow ausgeführt. Die Lösung wäre im Wesentlichen

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);
}

Möglicherweise können Sie die Ausgabeschritte in PostExecute ausführen. CreateNewOutputRows wird nicht in Transformation ausgeführt, sondern nur in Zielskripten.

John David
quelle
3

Ich beherrsche SSIS nicht sehr gut, aber ich denke, Sie könnten die folgenden Ideen ausprobieren:

  • Gehen Sie zur Skriptkomponente und bearbeiten Sie sie.
  • Gehen Sie zu Abschnitt Ein- und Ausgänge (3. Abschnitt).
  • gehe zu Output0 - Ausgabespalten,
  • Fügen Sie eine neue Spalte hinzu (geben Sie einen Namen und einen Typ ein, sagen wir Status - boolean).

Dann hätten Sie die leere Spalte für Ihre Ausgabe und müssen sie mit einigen Daten für jede der Eingabezeilen füllen:

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

Auf diese Weise können Sie Ihrer Ausgabetabelle eine Statusspalte hinzufügen. Hoffe das ist was du wolltest.

Marian
quelle