Descripción del modelo de objetos del componente de script
Tal y como se explicó en Codificar y depurar el componente de script, el proyecto del componente de script contiene tres elementos de proyecto:
El elemento ScriptMain, que contiene la clase ScriptMain donde se escribe el código. La clase ScriptMain hereda de la clase UserComponent.
El elemento ComponentWrapper, que contiene la clase UserComponent, una instancia de ScriptComponent que contiene los métodos y propiedades que utilizará para procesar los datos e interactuar con el paquete. El elemento ComponentWrapper también contiene las clases de colección Connections y Variables.
El elemento BufferWrapper, que contiene clases que hereda de ScriptBuffer para cada entrada y salida, así como propiedades con tipo para cada columna.
Al escribir el código en el elemento ScriptMain, utiliza los objetos, métodos y propiedades que se explican en este tema. Cada uno de los componentes no utilizará todos los métodos que se enumeran aquí; sin embargo, cuando se utilizan, lo hacen en la secuencia mostrada.
La clase base ScriptComponent no contiene ningún código de la implementación para los métodos descritos en este tema. Por tanto no es necesario, aunque tampoco es perjudicial, que agregue una llamada a la implementación de la clase base en su propia implementación del método.
Para obtener información sobre cómo utilizar los métodos y propiedades de estas clases en un tipo determinado del componente de script, vea la sección Ejemplos de componente de script adicionales. Los temas de ejemplo también contienen ejemplos de código completos.
Método AcquireConnections
Generalmente, los orígenes y destinos deben conectarse a un origen de datos externo. Invalide el método AcquireConnections de la clase base ScriptComponent para recuperar la conexión o la información de conexión del administrador de conexiones adecuado.
En el ejemplo siguiente se devuelve System.Data.SqlClient.SqlConnection de un administrador de conexiones ADO.NET.
Dim connMgr As IDTSConnectionManager100
Dim sqlConn As SqlConnection
Public Overrides Sub AcquireConnections(ByVal Transaction As Object)
connMgr = Me.Connections.MyADONETConnection
sqlConn = CType(connMgr.AcquireConnection(Nothing), SqlConnection)
End Sub
En el ejemplo siguiente se devuelve una ruta de acceso completa y el nombre de archivo de un administrador de conexiones de archivos planos y, a continuación, se abre el archivo mediante System.IO.StreamReader.
Private textReader As StreamReader
Public Overrides Sub AcquireConnections(ByVal Transaction As Object)
Dim connMgr As IDTSConnectionManager100 = _
Me.Connections.MyFlatFileSrcConnectionManager
Dim exportedAddressFile As String = _
CType(connMgr.AcquireConnection(Nothing), String)
textReader = New StreamReader(exportedAddressFile)
End Sub
Método PreExecute
Invalide el método PreExecute de la clase base ScriptComponent siempre que tenga que realizar el procesamiento una sola vez antes de iniciar el procesamiento de las filas de datos. Por ejemplo, en un destino, es posible que desee configurar el comando con parámetros que utilizará el destino para insertar cada fila de datos en el origen de datos.
Dim sqlConn As SqlConnection
Dim sqlCmd As SqlCommand
Dim sqlParam As SqlParameter
...
Public Overrides Sub PreExecute()
sqlCmd = New SqlCommand("INSERT INTO Person.Address2(AddressID, City) " & _
"VALUES(@addressid, @city)", sqlConn)
sqlParam = New SqlParameter("@addressid", SqlDbType.Int)
sqlCmd.Parameters.Add(sqlParam)
sqlParam = New SqlParameter("@city", SqlDbType.NVarChar, 30)
sqlCmd.Parameters.Add(sqlParam)
End Sub
SqlConnection sqlConn;
SqlCommand sqlCmd;
SqlParameter sqlParam;
public override void PreExecute()
{
sqlCmd = new SqlCommand("INSERT INTO Person.Address2(AddressID, City) " + "VALUES(@addressid, @city)", sqlConn);
sqlParam = new SqlParameter("@addressid", SqlDbType.Int);
sqlCmd.Parameters.Add(sqlParam);
sqlParam = new SqlParameter("@city", SqlDbType.NVarChar, 30);
sqlCmd.Parameters.Add(sqlParam);
}
Procesar entradas y salidas
Procesar entradas
Los componentes de script que se configuran como transformaciones o destinos tienen una entrada.
Qué proporciona el elemento de proyecto BufferWrapper
Para cada entrada que ha configurado, el elemento de proyecto BufferWrapper contiene una clase que deriva de ScriptBuffer y tiene el mismo nombre que la entrada. Cada clase de búfer de entrada contiene las siguientes propiedades, funciones y métodos:
Propiedades de descriptor de acceso con nombre y tipo para cada columna de entrada seleccionada. Estas propiedades son de sólo lectura o de lectura y escritura dependiendo del Tipo de uso especificado para la columna en la página Columnas de entrada del Editor de transformación Script.
Una propiedad <column>_IsNull para cada columna de entrada seleccionada. Esta propiedad también es de sólo lectura o de lectura y escritura dependiendo del Tipo de uso especificado para la columna.
Un método DirectRowTo<outputbuffer> para cada salida configurada. Utilizará estos métodos al filtrar las filas a una de varias salidas en el mismo ExclusionGroup.
Una función NextRow para obtener la siguiente fila de entrada y una función EndOfRowset para determinar si se ha procesado el último búfer de datos. Normalmente no necesita estas funciones al utilizar los métodos de procesamiento de entrada implementados en la clase base UserComponent. En la sección siguiente se proporciona más información sobre la clase base UserComponent.
Qué proporciona el elemento de proyecto ComponentWrapper
El elemento de proyecto ComponentWrapper contiene una clase denominada UserComponent que deriva de ScriptComponent. La clase ScriptMain donde escribe el código personalizado deriva a su vez de UserComponent. La clase UserComponent contiene los siguientes métodos:
Una implementación invalidada del método ProcessInput. Éste es el método al que el motor de flujo de datos llama en tiempo de ejecución después del método PreExecute y al que se puede llamar varias veces. ProcessInput entrega el procesamiento al método <inputbuffer>_ProcessInput. A continuación, el método ProcessInput comprueba el fin del búfer de entrada y, si se ha alcanzado, llama al método reemplazable FinishOutputs y al método privado MarkOutputsAsFinished. A continuación, el método MarkOutputsAsFinished llama a SetEndOfRowset en el último búfer de salida.
Una implementación reemplazable del método <inputbuffer>_ProcessInput. Esta implementación predeterminada simplemente recorre en bucle cada fila de entrada y llama a <inputbuffer>_ProcessInputRow.
Una implementación reemplazable del método <inputbuffer>_ProcessInputRow. La implementación predeterminada está vacía. Éste es el método que normalmente invalidará para escribir el código personalizado de procesamiento de datos.
Qué debe hacer el código personalizado
Puede utilizar los métodos siguientes para procesar la entrada en la clase ScriptMain:
Invalide <inputbuffer>_ProcessInputRow para procesar los datos de cada fila de entrada cuando el código pase por ellos.
Invalide <inputbuffer>_ProcessInput solamente si es necesaria alguna acción adicional mientras se recorren en bucle las filas de entrada. (Por ejemplo, si tiene que comprobar EndOfRowset para realizar alguna otra acción una vez procesadas todas las filas.) Llame a <inputbuffer>_ProcessInputRow para realizar el procesamiento de filas.
Invalide FinishOutputs si es necesaria alguna acción adicional en las salidas antes de cerrarlas.
El método ProcessInput garantiza que las llamadas a estos métodos se realizan en el momento adecuado.
Procesar salidas
Los componentes de script configurados como orígenes o transformaciones tienen una o más salidas.
Qué proporciona el elemento de proyecto BufferWrapper
Para cada salida que ha configurado, el elemento de proyecto BufferWrapper contiene una clase que deriva de ScriptBuffer y tiene el mismo nombre que la salida. Cada clase de búfer de entrada contiene las siguientes propiedades y métodos:
Propiedades de descriptor de acceso con nombre y tipo de sólo escritura para cada columna de salida.
Una propiedad <column>_IsNull de sólo escritura para cada columna de salida seleccionada que puede utilizar para establecer el valor de columna en null.
Un método AddRow para agregar una nueva fila vacía al búfer de salida.
Un método SetEndOfRowset para permitir que el motor de flujo de datos sepa que no se esperan más búferes de datos. También existe una función EndOfRowset para determinar si el búfer actual es el último búfer de datos. Normalmente no necesita estas funciones al utilizar los métodos de procesamiento de entrada implementados en la clase base UserComponent.
Qué proporciona el elemento de proyecto ComponentWrapper
El elemento de proyecto ComponentWrapper contiene una clase denominada UserComponent que deriva de ScriptComponent. La clase ScriptMain donde escribe el código personalizado deriva a su vez de UserComponent. La clase UserComponent contiene los siguientes métodos:
Una implementación invalidada del método PrimeOutput. El motor de flujo de datos llama a este método antes de ProcessInput en tiempo de ejecución y solamente lo llama una vez. PrimeOutput envía el procesamiento al método CreateNewOutputRows. A continuación, si el componente es un origen (es decir, el componente no tiene ninguna entrada), PrimeOutput llama al método reemplazable FinishOutputs y al método privado MarkOutputsAsFinished. El método MarkOutputsAsFinished llama a SetEndOfRowset en el último búfer de salida.
Una implementación reemplazable del método CreateNewOutputRows. La implementación predeterminada está vacía. Éste es el método que normalmente invalidará para escribir el código personalizado de procesamiento de datos.
Qué debe hacer el código personalizado
Puede utilizar los métodos siguientes para procesar las salidas en la clase ScriptMain:
Invalide CreateNewOutputRows solamente si puede agregar y rellenar las filas de salida antes de procesar las filas de entrada. Por ejemplo, puede utilizar CreateNewOutputRows en un origen, pero en una transformación con salidas asincrónicas debe llamar a AddRow durante o después del procesamiento de los datos de entrada.
Invalide FinishOutputs si es necesaria alguna acción adicional en las salidas antes de cerrarlas.
El método PrimeOutput garantiza que las llamadas a estos métodos se realizan en el momento adecuado.
Método PostExecute
Invalide el método PostExecute de la clase base ScriptComponent cada vez que cuente con procesamiento que se debe realizar solamente una vez después de procesar las filas de datos. Por ejemplo, en un origen, puede cerrar la clase System.Data.SqlClient.SqlDataReader que ha utilizado para cargar datos en el flujo de datos.
Importante |
---|
La colección de ReadWriteVariables solamente está disponible en el método PostExecute. Por tanto, no puede incrementar directamente el valor de una variable de paquete cuando procesa cada fila de datos. Incremente el valor de una variable local en su lugar y establezca el valor de la variable de paquete en el de la variable local en el método PostExecute una vez procesados todos los datos. |
Método ReleaseConnections
Generalmente, los orígenes y destinos deben conectarse a un origen de datos externo. Invalide el método ReleaseConnections de la clase base ScriptComponent para cerrar y liberar la conexión abierta previamente en el método AcquireConnections.
Dim connMgr As IDTSConnectionManager100
...
Public Overrides Sub ReleaseConnections()
connMgr.ReleaseConnection(sqlConn)
End Sub
IDTSConnectionManager100 connMgr;
public override void ReleaseConnections()
{
connMgr.ReleaseConnection(sqlConn);
}
|