Compartir a través de


Codificar un proveedor de registro personalizado

Después de haber creado una clase que hereda de la clase base LogProviderBase y de haber aplicado el atributo DtsLogProviderAttribute a la clase, debe invalidar la implementación de las propiedades y los métodos de la clase base para proporcionar la funcionalidad personalizada.

Para obtener algunos ejemplos funcionales de proveedores de registro personalizados, vea los ejemplos de Integration Services en Codeplex.

Configurar el proveedor de registro

Inicializar el proveedor de registro

Puede invalidar el método InitializeLogProvider para almacenar en memoria caché las referencias a las colecciones de conexiones y a la interfaz de eventos. Puede utilizar estas referencias almacenadas en memoria caché más adelante en otros métodos del proveedor de registro.

Utilizar la propiedad ConfigString

En tiempo de diseño, un proveedor de registro recibe información de configuración de la columna Configuración. Esta información de configuración corresponde a la propiedad ConfigString del proveedor de registro. De forma predeterminada, esta columna contiene un cuadro de texto del que puede recuperar cualquier información de cadena. La mayoría de los proveedores de registro incluidos con Integration Services utilizan esta propiedad para almacenar el nombre del administrador de conexión que el proveedor utiliza para conectarse a un origen de datos externo. Si el proveedor de registro utiliza la propiedad ConfigString, utilice el método Validate para validar esta propiedad y asegurarse de que se establece la propiedad correctamente.

Validar el proveedor de registro

Puede invalidar el método Validate para asegurarse de que el proveedor se ha configurado correctamente y está listo para la ejecución. Normalmente, un nivel mínimo de validación es asegurarse de que se establece ConfigString correctamente. La ejecución no puede continuar hasta que el proveedor de registro devuelva Success en el método Validate.

En el ejemplo de código siguiente se muestra una implementación de Validate que garantiza que se especifica el nombre de un administrador de conexión, que existe el administrador de conexión en el paquete y que el administrador de conexión devuelve un nombre de archivo en la propiedad ConfigString.

public override DTSExecResult Validate(IDTSInfoEvents infoEvents)
{
    if (this.ConfigString.Length == 0 || connections.Contains(ConfigString) == false)
    {
        infoEvents.FireError(0, "MyTextLogProvider", "The ConnectionManager " + ConfigString + " specified in the ConfigString property cannot be found in the collection.", "", 0);
        return DTSExecResult.Failure;
    }
    else
    {
        string fileName = connections[ConfigString].AcquireConnection(null) as string;

        if (fileName == null || fileName.Length == 0)
        {
            infoEvents.FireError(0, "MyTextLogProvider", "The ConnectionManager " + ConfigString + " specified in the ConfigString property cannot be found in the collection.", "", 0);
            return DTSExecResult.Failure;
        }
    }
    return DTSExecResult.Success;
}
Public Overrides Function Validate(ByVal infoEvents As IDTSInfoEvents) As DTSExecResult
    If Me.ConfigString.Length = 0 Or connections.Contains(ConfigString) = False Then
        infoEvents.FireError(0, "MyTextLogProvider", "The ConnectionManager " + ConfigString + " specified in the ConfigString property cannot be found in the collection.", "", 0)
        Return DTSExecResult.Failure
    Else 
        Dim fileName As String =  connections(ConfigString).AcquireConnectionCType(as string, Nothing)
 
        If fileName = Nothing Or fileName.Length = 0 Then
            infoEvents.FireError(0, "MyTextLogProvider", "The ConnectionManager " + ConfigString + " specified in the ConfigString property cannot be found in the collection.", "", 0)
            Return DTSExecResult.Failure
        End If
    End If
    Return DTSExecResult.Success
End Function

Conservar el proveedor de registro

Normalmente, no tiene que implementar la persistencia personalizada para un administrador de conexión. Sólo se requiere la persistencia personalizada cuando las propiedades de un objeto usan tipos de datos complejos. Para obtener más información, vea Desarrollar objetos personalizados para Integration Services.

Registrar con el proveedor de registro

Hay tres métodos en tiempo de ejecución que todos los proveedores de registro deben invalidar: OpenLog, Log y CloseLog.

Nota importanteImportante

Durante la validación y ejecución de un paquete único, se llama a los métodos CloseLog y OpenLog más de una vez. Asegúrese de que el código personalizado no hace que las entradas de registro anteriores se invaliden por la siguiente apertura y cierre del registro. Si ha seleccionado registrar los eventos de validación en el paquete de prueba, el primer evento registrado que debería ver es OnPreValidate; si en su lugar el primer evento registrado que ve es PackageStart, se han invalidado los eventos de validación iniciales.

Abrir el registro

La mayoría de los proveedores de registro se conectan a un origen de datos externo, como un archivo o una base de datos, para almacenar la información de evento que se recopila durante la ejecución del paquete. Como con cualquier otro objeto en tiempo de ejecución, la conexión al origen de datos externo se lleva a cabo normalmente utilizando los objetos del administrador de conexión.

Se llama al método OpenLog al iniciar la ejecución del paquete. Invalide este método para establecer una conexión al origen de datos externo.

En el código de ejemplo siguiente se muestra un proveedor de registro que abre un archivo de texto para la escritura durante OpenLog. Abre el archivo llamando al método AcquireConnection del administrador de conexión especificado en la propiedad ConfigString.

public override void OpenLog()
{
    if(!this.connections.Contains(this.ConfigString))
        throw new Exception("The ConnectionManager " + this.ConfigString + " does not exist in the Connections collection.");

    this.connectionManager = connections[ConfigString];
    string filePath = this.connectionManager.AcquireConnection(null) as string;

    if(filePath == null || filePath.Length == 0)
        throw new Exception("The ConnectionManager " + this.ConfigString + " is not a valid FILE ConnectionManager");

    //  Create a StreamWriter to append to.
    sw = new StreamWriter(filePath,true);

    sw.WriteLine("Open log" + System.DateTime.Now.ToShortTimeString());
}
Public Overrides  Sub OpenLog()
    If Not Me.connections.Contains(Me.ConfigString) Then
        Throw New Exception("The ConnectionManager " + Me.ConfigString + " does not exist in the Connections collection.")
    End If
 
    Me.connectionManager = connections(ConfigString)
    Dim filePath As String =  Me.connectionManager.AcquireConnectionCType(as string, Nothing)
 
    If filePath = Nothing Or filePath.Length = 0 Then
        Throw New Exception("The ConnectionManager " + Me.ConfigString + " is not a valid FILE ConnectionManager")
    End If
 
    '  Create a StreamWriter to append to.
    sw = New StreamWriter(filePath,True)
 
    sw.WriteLine("Open log" + System.DateTime.Now.ToShortTimeString())
End Sub

Escribir entradas del registro

Se llama al método Log cada vez que un objeto del paquete provoca un evento llamando a un método Fire<event> en una de las interfaces de eventos. Cada evento se provoca con información sobre su contexto y normalmente un mensaje explicativo. Sin embargo, no todas las llamadas al método Log incluyen información de todos los parámetros de método. Por ejemplo, algunos eventos estándar cuyos nombres son autoexplicativos no proporcionan MessageText, y DataCode y DataBytes están pensados para la información complementaria opcional.

En el ejemplo de código siguiente se implementa el método Log y se escriben los eventos en la secuencia que se abrió en la sección anterior.

public override void Log(string logEntryName, string computerName, string operatorName, string sourceName, string sourceID, string executionID, string messageText, DateTime startTime, DateTime endTime, int dataCode, byte[] dataBytes)
{
    sw.Write(logEntryName + ",");
    sw.Write(computerName + ",");
    sw.Write(operatorName + ",");
    sw.Write(sourceName + ",");
    sw.Write(sourceID + ",");
    sw.Write(messageText + ",");
    sw.Write(dataBytes + ",");
    sw.WriteLine("");
}
Public Overrides  Sub Log(ByVal logEnTryName As String, ByVal computerName As String, ByVal operatorName As String, ByVal sourceName As String, ByVal sourceID As String, ByVal executionID As String, ByVal messageText As String, ByVal startTime As DateTime, ByVal endTime As DateTime, ByVal dataCode As Integer, ByVal dataBytes() As Byte)
    sw.Write(logEnTryName + ",")
    sw.Write(computerName + ",")
    sw.Write(operatorName + ",")
    sw.Write(sourceName + ",")
    sw.Write(sourceID + ",")
    sw.Write(messageText + ",")
    sw.Write(dataBytes + ",")
    sw.WriteLine("")
End Sub

Cerrar el registro

Se llama al método CloseLog al final de la ejecución del paquete, después de que todos los objetos del paquete han completado la ejecución, o bien, cuando el paquete se detiene debido a los errores.

En el ejemplo de código siguiente se muestra una implementación del método CloseLog que cierra la secuencia de archivo que se abrió durante el método OpenLog.

public override void CloseLog()
{
    if (sw != null)
    {
        sw.WriteLine("Close log" + System.DateTime.Now.ToShortTimeString());
        sw.Close();
    }
}
Public Overrides  Sub CloseLog()
    If Not sw Is Nothing Then
        sw.WriteLine("Close log" + System.DateTime.Now.ToShortTimeString())
        sw.Close()
    End If
End Sub
Icono de Integration Services (pequeño) Manténgase al día con Integration Services

Para obtener las descargas, los artículos, los ejemplos y los vídeos más recientes de Microsoft, así como soluciones seleccionadas de la comunidad, visite la página de Integration Services en MSDN o TechNet:

Para recibir notificaciones automáticas de estas actualizaciones, suscríbase a las fuentes RSS disponibles en la página.