Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Как описано в [кодировании и отладке компонента скрипта](.). /extending-packages-scripting/data-flow-script-component/coding-and-debugging-the-script-component.md, проект компонента скрипта содержит три элемента проекта:
Элемент
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 и совпадающий по имени с выходом. Каждый класс входного буфера содержит перечисленные далее свойства и методы.
Именованные и типизированные свойства метода доступа только для записи для каждого выходного столбца.
Свойство> только <для записи_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 на сайте MSDN:
Посетить страницу «Службы Integration Services» на сайте MSDN
Чтобы получать автоматические уведомления об этих обновлениях, подпишитесь на RSS-каналы, предлагаемые на этой странице.
См. также
Настройка компонента скрипта в редакторе компонентов скрипта [кодирование и отладка компонента скрипта](.). /extending-packages-scripting/data-flow-script-component/coding-and-debugging-the-script-component.md