Tengo una tarea de secuencia de comandos que está realizando transformaciones en el medio de un flujo de datos SSIS. Si el script falla (por ejemplo, si intenta convertir alfa numérico) la necesito para parar con un ‘error’ de estado y volver a la principal paquete y, a continuación, utilizar la Tarea de flujo de datos de Controlador de Eventos OnError para salir correctamente.

Por el momento me parece que la tarea de secuencia de comandos en el flujo de datos devuelve un .red emergente de error de que tengo que claro entonces. Yo he probado un Try Catch todo el código que parece detener la depuración de la ventana que aparece, pero me parece que no puede llegar a salir de la secuencia de comandos con un ‘estado fallido’ que hará que el paquete de error. El Dts.TaskResult = Dts.Resultados.El fracaso no parece ser válido en tareas de flujo de datos. En este momento estoy tratando de esto:

    Catch e As System.Exception
        Me.ComponentMetaData.FireError(-1, "", "Error: ", e.Message, 1, True)
        While Not e.InnerException Is Nothing
            e = e.InnerException
            Me.ComponentMetaData.FireError(-1, "", "InnerException: ", e.Message, 1, True)
        End While
        Exit Sub
    End Try

… pero todo esto no es pasar a la mala fila. El flujo de datos continúa. El problema es llegar a la salida como ‘error’ de modo que el onError error de controlador de eventos en el paquete de bonificación.

Sugerencias recibidas con gratitud.
Glenn

  • Por CIERTO, si es en un Flujo de Datos, entonces es un Componente de secuencia de Comandos, no es una Tarea de secuencia de Comandos.
InformationsquelleAutor Glenn M | 2009-09-29

4 Comentarios

  1. 3

    Secuencia de comandos de Transformaciones que no tienen las mismas características para el retorno de éxito o fracaso. Usted puede forzar un error al utilizar este código:

        If Row.TestColumn = "Value I Want To Error On" Then
            Error (1)
        End If
    

    Básicamente, el objeto de Error (función? método? ¡lo que sea!) le permitirá simular un error. Es decir, puede hacer que el paquete de error con este código.

    • Gracias. Como actividad de seguimiento, me doy cuenta de algunos confusión que prevalecía en mi final. La ventana emergente de error es realmente deseable y probablemente necesaria para el frontend para saber cuál es el problema. Dejé todos mis Try Catch código en el script y dejar que el paquete de fallar por sí mismo, y cuando me encontré en la interfaz de la ventana de depuración en el VS fue reemplazado con una web de error (que está bien) y en el backend el paquete continuó con el evento OnError (que limpia algunas tablas). La confusión llegó a través de la necesidad de hacer clic en ACEPTAR en el VS para borrar el error, pero por supuesto esto no es un requisito cuando se ejecuta el paquete fuera de VS.
    • Tienes razón en que la eliminación de la prueba bloque Catch permitirá a los fracasos a fallar de forma automática. Me encontré con este problema aproximadamente hace 1 mes y llegó a la misma conclusión. Llegué a la solución primero, obligando a un error en el bloque Try Catch. Luego he añadido un error en el bloque Catch. Tan pronto como llegué a este para forzar el error, me di cuenta de que el problema era el Try Catch bloquear por completo. Vamos a SSIS manejar la excepción en lugar de la manipulación de ti mismo.
  2. 1

    En retrospectiva, el error de división por cero no es necesario.

    En mi solución actual, estoy capturar el error, a continuación, haciendo un FireError, entonces reimplementing el manejo de excepciones, como este:

    If excludeHeader = -1 Then
        'Throw New InvalidDataException("Invalid exclude column: " & Variables.excludeColumn)
        ComponentMetaData.FireError(0, ComponentMetaData.Name.Trim(), "Invalid exclude column: " & Variables.excludeColumn, String.Empty, 0, True)
        excelConnection.Close()
        excelConnection.Dispose()
        Return
    End If
    

    Esto funciona porque está dentro de una Fuente de secuencia de Comandos, y también el trabajo en un Script de Transformación de proporcionar el flujo de datos se establece a fallar después de 1 error. Si no, la secuencia de comandos sería necesario implementar un error de ruta de salida que, francamente, no tengo tiempo para…

  3. 0

    He estado buscando por un tiempo a la respuesta a esta pregunta. La ventana emergente de error es demasiado molesto para mí! Para evitar esto, una «simple» solución (hack) es este:

    Vez de tirar un error después de la .FireError, crear un nuevo DT_UI1 columna de salida de la secuencia de comandos de transformación, por ejemplo, «ValidationColumn», y se establece a 1 o 0 (No Booleano, por razones que serán evidentes).

    Inmediatamente después de la componente de secuencia de comandos, agregar una columna derivada de la transformación, y reemplazar el ValidationColumn con la fórmula: 1/ValidationColumn. (Esto no funciona con los Booleanos). Esto, por supuesto, generateds un error de división por cero, y (usando la configuración predeterminada) falla de la columna derivada de la transformación y por lo tanto inmediatamente el componente de flujo de datos. Voila!

    El registro de errores que tiene el original de error de validación del mensaje de la .FireError, seguido inmediatamente por un error de división por cero.

    Esto puede ser un hack, pero hasta que a alguien se le ocurre una mejor idea…

    Por CIERTO, estoy usando esto para comprobar que los archivos de Excel tiene la correcta encabezados en el lugar correcto (o alternativa lugares), en conjunción con el uso de IMEX=1, para cargar 2 o más columnas diferentes variaciones con un único flujo de datos…

  4. 0

    Siguiente es una tarea de secuencia de comandos que he creado dentro de un bucle. No es una respuesta directa a su pregunta – pero la idea general será de ayuda.

    La tarea de secuencia de comandos se mantiene dentro de un contenedor de secuencias. Y la secuencia del contenedor variable nombre Propagate se establece como falsa. También, para el sequence container la MaximumErrorCount propiedad se establece como cero. Así, cuando un error en el contenedor de secuencias se muestran en rojo, evento OnError despedido–, pero el bucle continuo. Es importante crear un controlador de eventos onerror para el contenedor de secuencias para que esto funcione.

    Dentro de la tarea de secuencia de comandos, que se fuerza fallado dentro de catch bloque (por ajuste de resultado de tarea como Fracaso). También el mensaje de excepción se almacena en una variable para almacenar en el registro de errores en la tabla. Este error de introducción de datos que sucede desde el evento OnError del controlador (mencionado anteriormente) de la tarea ejecutar sql.

    Consulte: MSDN – ScriptObjectModel.TaskResult Propiedad

    Utilizar el TaskResult propiedad del objeto Dts en la tarea de secuencia de Comandos de código para notificar el paquete del éxito o fracaso de la tarea de secuencia de Comandos.

    El bloque catch dentro de la tarea de secuencia de comandos similar al que se enumeran a continuación.

      Catch ex As Exception
    
            Dim exceptionVariable As Microsoft.SqlServer.Dts.Runtime.Variables = Nothing
            Dts.VariableDispenser.LockOneForWrite("User::ScriptException", exceptionVariable)
            exceptionVariable("User::CustomScriptException").Value = ex.Message
            exceptionVariable.Unlock()
            Dts.Events.FireError(-1, "Task Name", ex.Message, [String].Empty, 0)
            Dts.TaskResult = Dts.Results.Failure
      End Try
    

    De Control De Flujo

    Flujo de datos SSIS tarea de secuencia de comandos de control de error

Dejar respuesta

Please enter your comment!
Please enter your name here