Поделиться через


Основные сведения о модели объектов компонента скрипта

Как описано в [кодировании и отладке компонента скрипта](.). /extending-packages-scripting/data-flow-script-component/coding-and-debugging-the-script-component.md, проект компонента скрипта содержит три элемента проекта:

  1. Элемент ScriptMain, который содержит класс ScriptMain для создания кода. Класс ScriptMain наследуется от класса UserComponent.

  2. Элемент ComponentWrapper, который содержит класс UserComponent, экземпляр объекта ScriptComponent, который содержит методы и свойства для обработки данных и взаимодействия с пакетом. Элемент ComponentWrapper содержит также классы коллекций Connections и Variables.

  3. Элемент 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 и совпадающий по имени с выходом. Каждый класс входного буфера содержит перечисленные далее свойства и методы.

  • Именованные и типизированные свойства метода доступа только для записи для каждого выходного столбца.

  • Свойство> только <для записи_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);

}

Значок служб Integration Services (небольшой) Оставайтесь в курсе в службах Integration Services
Последние загрузки, статьи, примеры и видео из Корпорации Майкрософт, а также выбранные решения из сообщества, посетите страницу служб Integration Services на сайте MSDN:

Посетить страницу «Службы Integration Services» на сайте MSDN

Чтобы получать автоматические уведомления об этих обновлениях, подпишитесь на RSS-каналы, предлагаемые на этой странице.

См. также

Настройка компонента скрипта в редакторе компонентов скрипта [кодирование и отладка компонента скрипта](.). /extending-packages-scripting/data-flow-script-component/coding-and-debugging-the-script-component.md