Основные сведения о модели объектов компонента сценария
Как описано в разделе Кодирование и отладка компонента сценария, проект компонента сценария содержит три элемента проекта.
Элемент ScriptMain, который содержит класс ScriptMain для создания кода. Класс ScriptMain наследуется от класса UserComponent.
Элемент ComponentWrapper, который содержит класс UserComponent, экземпляр объекта ScriptComponent, который содержит методы и свойства для обработки данных и взаимодействия с пакетом. Элемент ComponentWrapper содержит также классы коллекций Connections и Variables.
Элемент BufferWrapper, который содержит классы, унаследованные от класса ScriptBuffer для каждого входа и выхода и типизированные свойства для каждого столбца.
При создании кода для элемента ScriptMain используются объекты, методы и свойства, обсуждаемые в данном разделе. Компонент может использовать не все перечисленные здесь методы. Однако если они используются, то используются в указанной последовательности.
Базовый класс ScriptComponent не содержит кода, реализующего методы, которые обсуждаются в данном разделе. Поэтому вызов базового класса в вашей собственной реализации этого метода не обязателен, но безопасен.
Дополнительные сведения об использовании методов и свойств этих классов в компоненте сценария определенного типа см. в разделе Дополнительные примеры компонента сценария. В разделах примеров также приведен полный образец кода.
Метод AcquireConnections
Источники и назначения обычно должны быть соединены с внешним источником данных. Переопределите метод AcquireConnections базового класса ScriptComponent, чтобы получить соединение или сведения о соединении из соответствующего диспетчера соединений.
Следующий пример возвращает соединение System.Data.SqlClient.SqlConnection из диспетчера соединений 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
Следующий пример возвращает полный путь и имя файла из диспетчера соединений с плоскими файлами, после чего открывает соответствующий файл с помощью объекта 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
Метод PreExecute
Переопределите метод PreExecute базового класса ScriptComponent, если необходимо однократно выполнить некоторые действия перед началом обработки строк данных. Например, в назначении может потребоваться настроить параметризованную команду, которая будет использоваться назначением для вставки строк данных в источник данных.
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);
}
Обработка входов и выходов
Обработка входов
Компоненты сценария, настроенные как преобразования или назначения, имеют один вход.
Содержимое элемента проекта BufferWrapper
Для каждого настроенного входа элемент проекта BufferWrapper содержит класс, порожденный от класса ScriptBuffer и совпадающий по имени с входом. Каждый класс входного буфера содержит перечисленные далее свойства, функции и методы.
Именованные и типизированные свойства метода доступа для каждого выбранного входного столбца. Эти свойства доступны только для чтения или для чтения и записи в зависимости от Типа применения, указанного для данного столбца на странице Входные столбцы диалогового окна Редактор преобразования «Сценарий».
Свойство <column>_IsNull для каждого выбранного входного столбца. Это свойство также доступно только для чтения или для чтения и записи в зависимости от типа применения, указанного для этого столбца.
Метод DirectRowTo<outputbuffer> для каждого настроенного выхода. Эти методы используются при фильтрации строк в один или несколько выходов одной и той же группы ExclusionGroup.
Функция NextRow для получения следующей входной строки и функция EndOfRowset для определения того, был ли обработан последний буфер данных. Обычно эти функции не нужны, если используются методы обработки ввода, реализованные в базовом классе UserComponent. В следующем разделе приводится более подробная информация о базовом классе UserComponent.
Содержимое элемента проекта ComponentWrapper
Элемент проекта ComponentWrapper содержит класс с именем UserComponent, производный от класса ScriptComponent. Класс ScriptMain, в котором создается пользовательский код, в свою очередь, является производным от класса UserComponent. Класс UserComponent содержит следующие методы.
Переопределенная реализация метода ProcessInput. Этот метод вызывается подсистемой обработки потока данных во время выполнения следом за методом PreExecute. Он может быть вызван более одного раза. ProcessInput передает обработку <inputbuffer>_ProcessInput методу. После этого метод ProcessInput проверяет, достигнут ли конец входного буфера, и в этом случае вызывает переопределяемый метод FinishOutputs, а также частный метод MarkOutputsAsFinished. Затем метод MarkOutputsAsFinished вызывает метод SetEndOfRowset для последнего выходного буфера.
Реализация метода <inputbuffer>_ProcessInput, доступная для переопределения. Данная реализация по умолчанию просто последовательно просматривает входящие строки и вызывает метод <inputbuffer>_ProcessInputRow.
Реализация метода <inputbuffer>_ProcessInputRow, доступная для переопределения. Реализация по умолчанию пуста. Этот метод обычно переопределяется, чтобы написать пользовательский код обработки данных.
Задачи, выполняемые в пользовательском коде
Для обработки входа в классе ScriptMain можно использовать перечисленные далее методы.
Переопределите метод <inputbuffer>_ProcessInputRow для обработки данных в каждой входной строке по мере ее прохождения.
Переопределите метод <inputbuffer>_ProcessInput, только если необходимо выполнять дополнительные действия по мере просмотра входных строк. (Например, если необходимо проверять условие EndOfRowset, чтобы предпринять какое-либо иное действие после обработки всех строк.) Вызывайте метод <inputbuffer>_ProcessInputRow для осуществления обработки строки.
Переопределите метод FinishOutputs, если нужно выполнять действия с выходами перед их закрытием.
Метод ProcessInput обеспечивает, что эти методы будут вызываться в нужное время.
Обработка выходов
Компоненты сценария, настроенные в качестве источников или преобразований, имеют один или несколько выходов.
Содержимое элемента проекта BufferWrapper
Для каждого настроенного выхода элемент проекта BufferWrapper содержит класс, порожденный от класса ScriptBuffer и совпадающий по имени с выходом. Каждый класс входного буфера содержит перечисленные далее свойства и методы.
Именованные и типизированные свойства метода доступа только для записи для каждого выходного столбца.
Свойство <column>_IsNull только для записи для каждого выбранного выходного столбца, который можно использовать для задания столбцу значения null.
Метод AddRow для добавления новой пустой строки в выходной буфер.
Метод SetEndOfRowset для оповещения подсистемы обработки потока данных о том, что буферов данных больше не ожидается. Имеется также функция EndOfRowset для определения того, является ли текущий буфер данных последним. Обычно эти функции не нужны, если используются методы обработки ввода, реализованные в базовом классе UserComponent.
Содержимое элемента проекта ComponentWrapper
Элемент проекта ComponentWrapper содержит класс с именем UserComponent, производный от класса ScriptComponent. Класс ScriptMain, в котором создается пользовательский код, в свою очередь, является производным от класса UserComponent. Класс UserComponent содержит следующие методы.
Переопределенная реализация метода PrimeOutput. Подсистема обработки потока данных вызывает этот метод перед методом ProcessInput во время выполнения. Он вызывается только один раз. PrimeOutput передает обработку методу CreateNewOutputRows. Затем, если компонент является источником (то есть не имеет входов), PrimeOutput вызывает переопределяемый метод FinishOutputs и частный метод MarkOutputsAsFinished. Метод MarkOutputsAsFinished вызывает метод SetEndOfRowset для последнего выходного буфера.
Реализация метода CreateNewOutputRows, доступная для переопределения. Реализация по умолчанию пуста. Этот метод обычно переопределяется, чтобы написать пользовательский код обработки данных.
Задачи, выполняемые в пользовательском коде
Для обработки выходов в классе ScriptMain можно использовать следующие методы.
Переопределите метод CreateNewOutputRows, только если возможно добавление и заполнение выходных строк перед обработкой входных строк. Например, метод CreateNewOutputRows можно использовать на источнике, но при преобразовании с использованием асинхронных выходов необходимо вызывать метод AddRow во время или после обработки входных данных.
Переопределите метод FinishOutputs, если нужно выполнять действия с выходами перед их закрытием.
Метод PrimeOutput обеспечивает, что эти методы будут вызываться в нужное время.
Метод PostExecute
Переопределите метод PostExecute базового класса ScriptComponent, если необходимо однократно выполнить некоторые действия после обработки всех строк данных. Например, можно закрыть на источнике объект System.Data.SqlClient.SqlDataReader, который используется для загрузки данных в поток данных.
Важно! |
---|
Коллекция ReadWriteVariables доступна только в методе PostExecute. Поэтому нельзя непосредственно увеличивать значение переменной пакета после обработки каждой строки данных. Вместо этого увеличьте значение локальной переменной и задайте это же значение переменной пакета в методе PostExecute после того, как все данные обработаны. |
Метод ReleaseConnections
Источники и назначения обычно должны быть соединены с внешним источником данных. Переопределите метод ReleaseConnections базового класса ScriptComponent, чтобы закрыть и освободить соединение, ранее открытое в методе AcquireConnections.
Dim connMgr As IDTSConnectionManager100
...
Public Overrides Sub ReleaseConnections()
connMgr.ReleaseConnection(sqlConn)
End Sub
IDTSConnectionManager100 connMgr;
public override void ReleaseConnections()
{
connMgr.ReleaseConnection(sqlConn);
}
|
См. также