Componente de secuencia de comandos SSIS: cómo modificar Output0Buffer

10

Tengo un componente de script que acepta registros de la tabla de base de datos SQL Azure. El script luego invoca un servicio web, que devuelve el número de registros fallidos y exitosos.

Para todos los registros, me gustaría agregar el campo Estado que tiene "éxito" o "error" y esto se obtiene del componente de script.

Luego registro esos resultados en un archivo de texto.

Problema: no he podido agregar el estado de cada registro de entrada ya que la llamada al servicio web solo ocurre en la ejecución posterior.

Intenté esto pero aún no funciona:

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
fuente
1
¿Por qué no puede ejecutar la llamada al servicio web durante el procesoinputrows? Todos los datos ya han pasado por la tubería una vez que está fuera de ese método. Usted está acumulando datos en la variable local, pero en este momento es como la celebración de una imagen de un coche que simplemente se alejó, sí, eso es lo que parecía, pero no va a volver
billinkc
@flybyte: ¿hay algo útil en mi respuesta?
Marian

Respuestas:

6

Todo en una transformación se realiza dentro de Input0_ProcessInputRow La solución sería esencialmente

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

Es posible que pueda realizar los pasos de salida en PostExecute, CreateNewOutputRows no se ejecuta en Transformación, solo en secuencias de comandos de destino.

JohnDavid
fuente
3

No soy muy competente en SSIS, pero creo que podrías probar las siguientes ideas:

  • ve al componente de script y edítalo,
  • vaya a la sección Entradas y salidas (3ra sección),
  • ir a Salida0 - Columnas de salida,
  • agregue una nueva columna (asígnele un nombre y tipo, digamos Estado - booleano).

Luego, tendrá la columna vacía en su salida y deberá completarla con algunos datos para cada una de las filas de entrada:

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

Esto lo ayudará a agregar una columna de Estado a su tabla de salida. Espero que esto sea lo que querías.

Mariana
fuente