Создание назначения с помощью компонента сценария
Компонент назначения в потоке данных пакета служб Integration Services используется для сохранения данных, полученных из вышестоящих источников и преобразований, в источник данных. Обычно компонент назначения подключается к источнику данных через существующий диспетчер соединений.
Общие сведения о компоненте сценария см. в разделе Расширение потока данных с помощью компонента сценария.
Компонент сценария и формируемый им код инфраструктуры значительно упрощают процесс создания пользовательских компонентов потока данных. Однако для понимания принципов работы компонента сценария полезно прочитать о шагах разработки пользовательских компонентов потока данных в разделе Разработка пользовательского компонента потока данных и особенно в разделе Разработка пользовательского компонента назначения.
Приступая к работе с компонентом назначения
При добавлении компонента сценария к вкладке «Поток данных» конструктора служб SSIS открывается диалоговое окно Выбор типа компонента сценария и приглашает вас выбрать сценарий Источник, Назначение или Преобразование. Выберите в этом диалоговом окне сценарий Назначение.
Затем подключите выход преобразования к компоненту назначения в конструкторе служб SSIS. Для целей тестирования можно напрямую соединить источник с назначением без преобразований.
Настройка компонента назначения в режиме конструктора метаданных
Выбрав параметр создания компонента назначения, можно настроить его с помощью редактора преобразования «Сценарий». Дополнительные сведения см. в разделе Настройка компонента сценария в редакторе компонента сценария.
Чтобы задать язык, используемый в сценарии назначения, установите свойство Язык сценария страницы Сценарий диалогового окна редактора преобразования «Сценарий».
Примечание |
---|
Чтобы установить язык сценария по умолчанию для компонента сценария, воспользуйтесь параметром Язык сценария страницы Общие диалогового окна Параметры. Дополнительные сведения см. в разделе Страница «Общие». |
Компонент назначения потока данных имеет один вход и ни одного выхода. Настройка входа компонента — один из шагов, которые надо завершить в режиме конструктора метаданных с помощью редактора преобразования «Сценарий».
Добавление диспетчеров соединений
Обычно компонент назначения через существующий диспетчер соединений подключается к источнику данных, куда сохраняет данные из потока данных. На странице Диспетчеры соединений в редакторе преобразования «Сценарий» нажмите кнопку Добавить, чтобы добавить нужный диспетчер соединений.
Однако диспетчер соединений представляет собой лишь удобную оболочку, которая инкапсулирует и хранит информацию, нужную для подключения к источнику данных определенного типа. Для загрузки и сохранения данных, и, возможно, также для открытия и закрытия соединения с источником данных нужно разрабатывать собственный код.
Общие сведения об использовании диспетчеров соединений в компоненте сценария см. в разделе Соединение с источниками данных в компоненте сценария.
Дополнительные сведения о странице Диспетчеры соединенийредактора преобразования «Сценарий» см. в разделе Редактор преобразования «Сценарий» (страница «Диспетчеры соединений»).
Настройка входов и входных столбцов
Компонент назначения имеет один вход и ни одного выхода.
На странице Входные столбцы диалогового окна Редактора преобразования «Сценарий» есть список доступных столбцов из вывода вышестоящего компонента потока данных. Выберите столбцы, которые нужно сохранить.
Дополнительные сведения о странице Входные столбцыредактора преобразования «Сценарий» см. в разделе Редактор преобразования «Сценарий» (страница «Входные столбцы»).
Страница Входы и выходы диалогового окна Редактор преобразования «Сценарий» показывает один вход, который можно переименовать. В сценарии можно ссылаться на столбец ввода по имени с помощью свойства метода доступа, созданного автоматически.
Дополнительные сведения о странице Входы и выходыредактора преобразования «Сценарий» см. в разделе Редактор преобразования «Сценарий» (страница «Входы и выводы»).
Добавление переменных
Если нужно использовать в сценарии существующие переменные, их можно добавить в поля свойств ReadOnlyVariables и ReadWriteVariables на странице Сценарий в редакторе преобразования «Сценарий».
Если в поле свойства добавляются несколько переменных, их имена нужно разделять запятыми. Также можно выбрать несколько переменных, нажав кнопку с многоточием (…), расположенную рядом с полями свойств ReadOnlyVariables и ReadWriteVariables, а затем выбрав переменные в диалоговом окне Выбор переменные.
Общие сведения об использовании переменных в компоненте сценария см. в разделе Использование переменных в компоненте сценария.
Дополнительные сведения о странице Сценарийредактора преобразования «Сценарий» см. в разделе Редактор преобразования «Сценарий» (страница «Сценарий»).
Создание сценария для компонента назначения в режиме конструктора кода
После настройки метаданных для компонента можно написать пользовательский сценарий. В редакторе преобразования «Сценарий» на странице Сценарий нажмите кнопку Изменить сценарий, чтобы открыть интегрированную среду разработки средств MicrosoftVisual Studio для приложений (VSTA), где можно добавить пользовательский сценарий. Используемый язык сценария зависит от значения свойства ScriptLanguage на странице Сценарий. Для него можно выбрать язык MicrosoftVisual Basic 2008 или MicrosoftVisual C# 2008.
Важные сведения, относящиеся ко всем типам компонентов, создаваемых с помощью компонента сценария, см. в разделе Кодирование и отладка компонента сценария.
Основные сведения об автоматически создаваемом коде
При открытии интегрированной среды разработки VSTA после создания и настройки компонента назначения в редакторе кода появляется редактируемый класс ScriptMain с заглушкой для метода ProcessInputRow. Класс ScriptMain — место для размещения собственного кода, а метод ProcessInputRow — самый важный метод в компоненте назначения.
Есть открыть окно Обозреватель объектов в средствах VSTA, можно увидеть, что для компонента сценария были созданы элементы проекта BufferWrapper и ComponentWrapper, доступные только для чтения. Класс ScriptMain наследует класс UserComponent в элементе проекта ComponentWrapper.
Во время выполнения подсистема обработки потока данных вызывает метод ProcessInput в классе UserComponent, который переопределяет метод ProcessInput родительского класса ScriptComponent. В свою очередь, метод ProcessInput проходит по строкам во входном буфере и вызывает для каждой строки метод ProcessInputRow.
Написание пользовательского кода
Для завершения пользовательского компонента назначения можно ввести сценарии в следующие методы, доступные в классе ScriptMain.
Переопределите метод AcquireConnections для соединения с внешним источником данных. Извлеките из диспетчера соединений объект соединения или необходимые сведения о соединении.
Для подготовки к сохранению данных переопределите метод PreExecute. Например, в этом методе можно создать и настроить объект SqlCommand и его параметры.
Используйте переопределенный метод ProcessInputRow для копирования всех строк ввода во внешний источник данных. Например, для назначения SQL Server можно скопировать значения столбцов в параметры SqlCommand и выполнить команду по одному разу для каждой строки. Для назначения «Плоский файл» можно записать значения столбцов в объект StreamWriter, разделяя значения разделителем столбцов.
Переопределите метод PostExecute для отключения от внешнего источника данных, если это требуется, и для выполнения всех прочих действий по очистке.
Примеры
Следующие примеры демонстрируют код, нужный классу ScriptMain для создания компонента назначения.
Примечание |
---|
В этих примерах используется таблица Person.Address из образца базы данных AdventureWorks и в поток данных передаются ее первый и четвертый столбец — intAddressID и nvarchar(30)City. Эти же данные используются в образцах источника, преобразования и назначения, приведенных в этом разделе. Для каждого примера дополнительно приведены необходимые компоненты и принимаемые предположения. |
Пример назначения ADO.NET
В этом примере показан компонент назначения, который с помощью существующего диспетчера соединений ADO.NET сохраняет данные из потока данных в таблицу SQL Server.
Для запуска этого образца кода необходимо настроить пакет и компонент следующим образом.
Создайте диспетчер соединений ADO.NET, использующий поставщик SqlClient для соединения с базой данных AdventureWorks.
Создайте целевую таблицу в базе данных AdventureWorks, выполнив следующую команду Transact-SQL:
CREATE TABLE [Person].[Address2]( [AddressID] [int] NOT NULL, [City] [nvarchar](30) NOT NULL )
Добавьте новый компонент сценария в область конструктора потока данных и настройте его в качестве назначения.
Соедините выход источника или преобразования, расположенного выше в потоке данных, с компонентом назначения в конструкторе служб SSIS. (Можно соединить источник непосредственно с назначением, не выполняя никаких преобразований.) Этот выход должен содержать данные из таблицы Person.Address образца базы данных AdventureWorks, которая содержит по крайней мере столбцы AddressID и City.
Откройте редактор преобразования «Сценарий». На странице Входные столбцы выберите входные столбцы AddressID и City.
На странице Входы и выходы измените имя входа на более описательное, например MyAddressInput.
На странице Диспетчеры соединений добавьте или создайте диспетчер соединений ADO.NET с описательным именем, например MyADONETConnectionManager.
На странице Сценарий нажмите кнопку Изменить сценарий и введите следующий сценарий. Затем закройте среду разработки сценария.
Закройте редактор преобразования «Сценарий» и запустите образец.
Imports System.Data.SqlClient
...
Public Class ScriptMain
Inherits UserComponent
Dim connMgr As IDTSConnectionManager100
Dim sqlConn As SqlConnection
Dim sqlCmd As SqlCommand
Dim sqlParam As SqlParameter
Public Overrides Sub AcquireConnections(ByVal Transaction As Object)
connMgr = Me.Connections.MyADONETConnectionManager
sqlConn = CType(connMgr.AcquireConnection(Nothing), SqlConnection)
End Sub
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
Public Overrides Sub MyAddressInput_ProcessInputRow(ByVal Row As MyAddressInputBuffer)
With sqlCmd
.Parameters("@addressid").Value = Row.AddressID
.Parameters("@city").Value = Row.City
.ExecuteNonQuery()
End With
End Sub
Public Overrides Sub ReleaseConnections()
connMgr.ReleaseConnection(sqlConn)
End Sub
End Class
using System.Data.SqlClient;
public class ScriptMain:
UserComponent
{
IDTSConnectionManager100 connMgr;
SqlConnection sqlConn;
SqlCommand sqlCmd;
SqlParameter sqlParam;
public override void AcquireConnections(object Transaction)
{
connMgr = this.Connections.MyADONETConnectionManager;
sqlConn = (SqlConnection)connMgr.AcquireConnection(null);
}
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);
}
public override void MyAddressInput_ProcessInputRow(MyAddressInputBuffer Row)
{
{
sqlCmd.Parameters["@addressid"].Value = Row.AddressID;
sqlCmd.Parameters["@city"].Value = Row.City;
sqlCmd.ExecuteNonQuery();
}
}
public override void ReleaseConnections()
{
connMgr.ReleaseConnection(sqlConn);
}
}
Пример назначения «Плоский файл»
В этом примере показан компонент назначения, который с помощью существующего диспетчера соединений с плоскими файлами сохраняет данные из потока данных в плоский файл.
Для запуска этого образца кода необходимо настроить пакет и компонент следующим образом.
Создайте диспетчер соединений с плоскими файлами, соединяющийся с целевым файлом. Файл может не существовать; компонент назначения создаст его. Настройте файл назначения как файл в формате величин, разделенных запятыми, содержащий столбцы AddressID и City.
Добавьте новый компонент сценария в область конструктора потока данных и настройте его в качестве назначения.
Соедините выход источника или преобразования, расположенного выше в потоке данных, с компонентом назначения в конструкторе служб SSIS. (Можно соединить источник непосредственно с назначением, не выполняя никаких преобразований.) Этот вывод должен предоставлять данные из таблицы Person.Address образца базы данных AdventureWorks и содержать по крайней мере столбцы AddressID и City.
Откройте редактор преобразования «Сценарий». На странице Input Columns выберите столбцы AddressID и City.
На странице Входы и выходы измените имя входа на более описательное, например MyAddressInput.
На странице Диспетчеры соединений добавьте или создайте диспетчер соединений с плоскими файлами с описательным именем, например MyFlatFileDestConnectionManager.
На странице Сценарий нажмите кнопку Изменить сценарий и введите следующий сценарий. Затем закройте среду разработки сценария.
Закройте редактор преобразования «Сценарий» и запустите образец.
Imports System.IO
...
Public Class ScriptMain
Inherits UserComponent
Dim copiedAddressFile As String
Private textWriter As StreamWriter
Private columnDelimiter As String = ","
Public Overrides Sub AcquireConnections(ByVal Transaction As Object)
Dim connMgr As IDTSConnectionManager100 = _
Me.Connections.MyFlatFileDestConnectionManager
copiedAddressFile = CType(connMgr.AcquireConnection(Nothing), String)
End Sub
Public Overrides Sub PreExecute()
textWriter = New StreamWriter(copiedAddressFile, False)
End Sub
Public Overrides Sub MyAddressInput_ProcessInputRow(ByVal Row As MyAddressInputBuffer)
With textWriter
If Not Row.AddressID_IsNull Then
.Write(Row.AddressID)
End If
.Write(columnDelimiter)
If Not Row.City_IsNull Then
.Write(Row.City)
End If
.WriteLine()
End With
End Sub
Public Overrides Sub PostExecute()
textWriter.Close()
End Sub
End Class
using System.IO;
public class ScriptMain:
UserComponent
{
string copiedAddressFile;
private StreamWriter textWriter;
private string columnDelimiter = ",";
public override void AcquireConnections(object Transaction)
{
IDTSConnectionManager100 connMgr = this.Connections.MyFlatFileDestConnectionManager;
copiedAddressFile = (string) connMgr.AcquireConnection(null);
}
public override void PreExecute()
{
textWriter = new StreamWriter(copiedAddressFile, false);
}
public override void MyAddressInput_ProcessInputRow(MyAddressInputBuffer Row)
{
{
if (!Row.AddressID_IsNull)
{
textWriter.Write(Row.AddressID);
}
textWriter.Write(columnDelimiter);
if (!Row.City_IsNull)
{
textWriter.Write(Row.City);
}
textWriter.WriteLine();
}
}
public override void PostExecute()
{
textWriter.Close();
}
}
|
См. также