Składnik skryptu SSIS - jak zmodyfikować Output0Buffer

10

Mam składnik skryptu, który akceptuje rekordy z tabeli bazy danych SQL Azure. Następnie skrypt wywołuje usługę internetową, która zwraca liczbę rekordów zakończonych niepowodzeniem i zakończonych powodzeniem.

Do wszystkich rekordów chciałbym dodać pole Status, które ma albo „sukces”, albo „porażkę”, a to pobiera dane wyjściowe ze skryptu.

Następnie loguję te dane wyjściowe do pliku tekstowego.

Problem: Nie byłem w stanie dodać statusu dla każdego rekordu wejściowego, ponieważ wywołanie usługi internetowej odbywa się tylko po wykonaniu.

Próbowałem tego, ale nadal nie działa:

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
źródło
1
Dlaczego nie można wykonać wywołania usługi sieci Web podczas operacji wprowadzania danych? Wszystkie dane zostały już przekazane do potoku, gdy są już wyłączone z tej metody. Gromadzisz dane w lokalnej zmiennej, ale w tym momencie to tak, jakbyś trzymał zdjęcie samochodu, który właśnie odjechał - tak, tak to wyglądało, ale nie wraca
billinkc
@flybyte: coś przydatnego w mojej odpowiedzi?
Marian

Odpowiedzi:

6

Wszystko w transformacji odbywa się w Input0_ProcessInputRow Rozwiązanie byłoby w istocie

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

Możesz wykonać kroki wyjściowe w PostExecute, CreateNewOutputRows nie jest uruchamiany w Transformacji, tylko w skryptach docelowych.

JohnDavid
źródło
3

Nie jestem zbyt biegły w SSIS, ale myślę, że możesz wypróbować następujące pomysły:

  • przejdź do komponentu skryptu i edytuj go,
  • przejdź do sekcji Wejścia i wyjścia (3. sekcja),
  • przejdź do Output0 - kolumny wyników,
  • dodaj nową kolumnę (nadaj jej nazwę i typ, powiedzmy Status - boolean).

Następnie miałbyś pustą kolumnę do swoich wyników i będziesz musiał wypełnić ją danymi dla każdego z wierszy wejściowych:

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

Pomoże to dodać kolumnę Status do tabeli wyników. Mam nadzieję, że tego właśnie chciałeś.

Marian
źródło