Основные сведения о модели объектов компонента скрипта
Область применения: среда выполнения интеграции SSIS SQL Server в Фабрика данных Azure
Как описано в разделе Кодирование и отладка компонента скрипта, проект компонента скрипта содержит три элемента проекта.
Элемент 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);
}
См. также
Настройка компонента скрипта в редакторе компонента скрипта
Кодирование и отладка компонента скрипта