Компонент скрипта служб SSIS - Как изменить буфер вывода 0

10

У меня есть компонент сценария, который принимает записи из таблицы базы данных SQL Azure. Затем скрипт вызывает веб-сервис, который возвращает количество неудачных и успешных записей.

Для всех записей я хотел бы добавить поле Status, которое имеет либо «success», либо «fail», и это получает выходные данные из компонента скрипта.

Затем я записываю эти выходные данные в текстовый файл.

Проблема: я не смог добавить статус для каждой входной записи, так как вызов веб-службы происходит только после выполнения.

Я попробовал это, но все еще не работает:

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
источник
1
Почему вы не можете выполнить вызов веб-службы во время выполнения процесса? Все данные уже пошли по конвейеру, как только они вышли из этого метода. Вы накапливаете данные в своей локальной переменной, но на данный момент это все равно, что держать фотографию автомобиля, который только что уехал - да, это то, на что это было похоже, но оно не возвращается
billinkc
@flybyte: что-нибудь полезное в моем ответе?
Мариан

Ответы:

6

Все в преобразовании делается внутри Input0_ProcessInputRow. Решение по существу будет

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

Вы можете выполнить шаги вывода в PostExecute, CreateNewOutputRows не запускается в Transformation, только в сценариях назначения.

JohnDavid
источник
3

Я не очень опытный в SSIS, но я думаю, что вы могли бы попробовать следующие идеи:

  • перейти к компоненту сценария и отредактировать его,
  • перейти в раздел «Входы и выходы» (3-й раздел),
  • перейти к Output0 - столбцы вывода,
  • добавить новый столбец (дать ему имя и тип, скажем, Status - логический).

Тогда у вас будет пустой столбец для вывода, и вам нужно будет заполнить его некоторыми данными для каждой из входных строк:

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

Это поможет вам добавить столбец Status в вашу выходную таблицу. Надеюсь, это то, что вы хотели.

Мэриан
источник