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


Создание назначения с помощью компонента скрипта

Компонент назначения в потоке данных пакета служб Integration Services используется для сохранения данных, полученных из вышестоящих источников и преобразований, в источник данных. Обычно компонент назначения подключается к источнику данных через существующий диспетчер соединений.

Общие сведения о компоненте скрипта см. в разделе Расширение потока данных с помощью компонента сценария.

Компонент скрипта и формируемый им код инфраструктуры значительно упрощают процесс создания пользовательских компонентов потока данных. Однако для понимания принципов работы компонента скрипта полезно прочитать о шагах разработки пользовательских компонентов потока данных в разделе Разработка пользовательского компонента потока данных и особенно в разделе Разработка пользовательского компонента назначения.

Приступая к работе с компонентом назначения

При добавлении компонента скрипта к вкладке «Поток данных» конструктора служб SSIS открывается диалоговое окно Выбор типа компонента скрипта и приглашает вас выбрать скрипт Источник, Назначение или Преобразование. Выберите в этом диалоговом окне скрипт Назначение.

Затем подключите выход преобразования к компоненту назначения в конструкторе служб SSIS. Для целей тестирования можно напрямую соединить источник с назначением без преобразований.

Настройка компонента назначения в режиме конструктора метаданных

Выбрав параметр создания компонента назначения, можно настроить его с помощью редактора преобразования «Скрипт». Дополнительные сведения см. в разделе Настройка компонента сценария в редакторе компонента сценария.

Чтобы задать язык, используемый в скрипте назначения, установите свойство Язык скрипта страницы Скрипт диалогового окна редактора преобразования «Скрипт».

ПримечаниеПримечание

Чтобы установить язык скрипта по умолчанию для компонента скрипта, воспользуйтесь параметром Язык скрипта страницы Общие диалогового окна Параметры. Дополнительные сведения см. в разделе Страница «Общие».

Компонент назначения потока данных имеет один вход и ни одного выхода. Настройка входа компонента — один из шагов, которые надо завершить в режиме конструктора метаданных с помощью редактора преобразования «Скрипт».

Добавление диспетчеров соединений

Обычно компонент назначения через существующий диспетчер соединений подключается к источнику данных, куда сохраняет данные из потока данных. На странице Диспетчеры соединений в редакторе преобразования «Скрипт» нажмите кнопку Добавить, чтобы добавить нужный диспетчер соединений.

Однако диспетчер соединений представляет собой лишь удобную оболочку, которая инкапсулирует и хранит информацию, нужную для подключения к источнику данных определенного типа. Для загрузки и сохранения данных, и, возможно, также для открытия и закрытия соединения с источником данных нужно разрабатывать собственный код.

Общие сведения об использовании диспетчеров соединений в компоненте скрипта см. в разделе Соединение с источниками данных в компоненте сценария.

Дополнительные сведения о странице Диспетчеры соединенийредактора преобразования «Скрипт» см. в разделе Редактор преобразования «Сценарий» (страница «Диспетчеры соединений»).

Настройка входов и входных столбцов

Компонент назначения имеет один вход и ни одного выхода.

На странице Входные столбцы диалогового окна Редактора преобразования «Скрипт» есть список доступных столбцов из вывода вышестоящего компонента потока данных. Выберите столбцы, которые нужно сохранить.

Дополнительные сведения о странице Входные столбцыредактора преобразования «Скрипт» см. в разделе Редактор преобразования «Сценарий» (страница «Входные столбцы»).

Страница Входы и выходы диалогового окна Редактор преобразования «Скрипт» показывает один вход, который можно переименовать. В скрипте можно ссылаться на столбец ввода по имени с помощью свойства метода доступа, созданного автоматически.

Дополнительные сведения о странице Входы и выходыредактора преобразования «Скрипт» см. в разделе Редактор преобразования «Сценарий» (страница «Входы и выводы»).

Добавление переменных

Если нужно использовать в скрипте существующие переменные, их можно добавить в поля свойств ReadOnlyVariables и ReadWriteVariables на странице Скрипт в редакторе преобразования «Скрипт».

Если в поле свойства добавляются несколько переменных, их имена нужно разделять запятыми. Также можно выбрать несколько переменных, нажав кнопку с многоточием (), расположенную рядом с полями свойств ReadOnlyVariables и ReadWriteVariables, а затем выбрав переменные в диалоговом окне Выбор переменные.

Общие сведения об использовании переменных в компоненте скрипта см. в разделе Использование переменных в компоненте сценария.

Дополнительные сведения о странице Скриптредактора преобразования «Скрипт» см. в разделе Редактор преобразования «Сценарий» (страница «Сценарий»).

Создание скрипта для компонента назначения в режиме конструктора кода

После настройки метаданных для компонента можно написать пользовательский скрипт. В редакторе преобразования «Скрипт» на странице Скрипт нажмите кнопку Изменить скрипт, чтобы открыть интегрированную среду разработки средств Microsoft Visual Studio для приложений (VSTA), где можно добавить пользовательский скрипт. Используемый язык скрипта зависит от значения свойства ScriptLanguage на странице Скрипт. Для него можно выбрать язык Microsoft Visual Basic 2008 или Microsoft Visual C# 2008.

Важные сведения, относящиеся ко всем типам компонентов, создаваемых с помощью компонента скрипта, см. в разделе Кодирование и отладка компонента сценария.

Основные сведения об автоматически создаваемом коде

При открытии интегрированной среды разработки VSTA после создания и настройки компонента назначения в редакторе кода появляется редактируемый класс ScriptMain с заглушкой для метода ProcessInputRow. Класс ScriptMain — место для размещения собственного кода, а метод ProcessInputRow — самый важный метод в компоненте назначения.

Есть открыть окно Обозреватель объектов в средствах VSTA, можно увидеть, что для компонента скрипта были созданы элементы проекта BufferWrapper и ComponentWrapper, доступные только для чтения. Класс ScriptMain наследует класс UserComponent в элементе проекта ComponentWrapper.

Во время выполнения подсистема обработки потока данных вызывает метод ProcessInput в классе UserComponent, который переопределяет метод ProcessInput родительского класса ScriptComponent. В свою очередь, метод ProcessInput проходит по строкам во входном буфере и вызывает для каждой строки метод ProcessInputRow.

Написание пользовательского кода

Для завершения пользовательского компонента назначения можно ввести скрипты в следующие методы, доступные в классе ScriptMain.

  1. Переопределите метод AcquireConnections для соединения с внешним источником данных. Извлеките из диспетчера соединений объект соединения или необходимые сведения о соединении.

  2. Для подготовки к сохранению данных переопределите метод PreExecute. Например, в этом методе можно создать и настроить объект SqlCommand и его параметры.

  3. Используйте переопределенный метод ProcessInputRow для копирования всех строк ввода во внешний источник данных. Например, для назначения SQL Server можно скопировать значения столбцов в параметры SqlCommand и выполнить команду по одному разу для каждой строки. Для назначения «Неструктурированный файл» можно записать значения столбцов в объект StreamWriter, разделяя значения разделителем столбцов.

  4. Переопределите метод PostExecute для отключения от внешнего источника данных, если это требуется, и для выполнения всех прочих действий по очистке.

Примеры

Следующие примеры демонстрируют код, нужный классу ScriptMain для создания компонента назначения.

ПримечаниеПримечание

В этих примерах используется таблица Person.Address из образца базы данных База данных AdventureWorks2008R2 и в поток данных передается ее первый и четвертый столбец — int AddressID и nvarchar(30) City. Эти же данные используются в образцах источника, преобразования и назначения, приведенных в этом разделе. Для каждого примера приведены необходимые дополнительные условия и принимаемые предположения.

Пример назначения ADO.NET

В этом примере показан компонент назначения, который с помощью существующего диспетчера соединений ADO.NET сохраняет данные из потока данных в таблицу SQL Server.

Для запуска этого образца кода необходимо настроить пакет и компонент следующим образом.

  1. Создайте диспетчер соединений ADO.NET, использующий поставщик SqlClient для соединения с базой данных База данных AdventureWorks2008R2.

  2. Создайте целевую таблицу в базе данных База данных AdventureWorks2008R2, выполнив следующую команду Transact-SQL:

    CREATE TABLE [Person].[Address2](
        [AddressID] [int] NOT NULL,
        [City] [nvarchar](30) NOT NULL
    )
    
  3. Добавьте новый компонент скрипта в область конструктора потока данных и настройте его в качестве назначения.

  4. Соедините выход источника или преобразования, расположенного выше в потоке данных, с компонентом назначения в конструкторе служб SSIS. (Можно соединить источник непосредственно с назначением, не выполняя никаких преобразований.) Этот выход должен содержать данные из таблицы Person.Address образца базы данных База данных AdventureWorks2008R2, которая содержит по крайней мере столбцы AddressID и City.

  5. Откройте редактор преобразования «Скрипт». На странице Входные столбцы выберите входные столбцы AddressID и City.

  6. На странице Входы и выходы измените имя входа на более описательное, например MyAddressInput.

  7. На странице Диспетчеры соединений добавьте или создайте диспетчер соединений ADO.NET с описательным именем, например MyADONETConnectionManager.

  8. На странице Скрипт нажмите кнопку Изменить скрипт и введите следующий скрипт. Затем закройте среду разработки скрипта.

  9. Закройте редактор преобразования «Скрипт» и запустите образец.

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);

    }

}

Пример назначения «Неструктурированный файл»

В этом примере показан компонент назначения, который с помощью существующего диспетчера соединений с неструктурированными файлами сохраняет данные из потока данных в неструктурированный файл.

Для запуска этого образца кода необходимо настроить пакет и компонент следующим образом.

  1. Создайте диспетчер соединений с неструктурированными файлами, соединяющийся с целевым файлом. Файл может не существовать; компонент назначения создаст его. Настройте файл назначения как файл в формате величин, разделенных запятыми, содержащий столбцы AddressID и City.

  2. Добавьте новый компонент скрипта в область конструктора потока данных и настройте его в качестве назначения.

  3. Соедините выход источника или преобразования, расположенного выше в потоке данных, с компонентом назначения в конструкторе служб SSIS. (Можно соединить источник непосредственно с назначением, не выполняя никаких преобразований.) Этот вывод должен предоставлять данные из таблицы Person.Address образца базы данных База данных AdventureWorks2008R2 и содержать по крайней мере столбцы AddressID и City.

  4. Откройте редактор преобразования «Скрипт». На странице Input Columns выберите столбцы AddressID и City.

  5. На странице Входы и выходы измените имя входа на более описательное, например MyAddressInput.

  6. На странице Диспетчеры соединений добавьте или создайте диспетчер соединений с неструктурированными файлами с описательным именем, например MyFlatFileDestConnectionManager.

  7. На странице Скрипт нажмите кнопку Изменить скрипт и введите следующий скрипт. Затем закройте среду разработки скрипта.

  8. Закройте редактор преобразования «Скрипт» и запустите образец.

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();

    }

}
Значок служб Integration Services (маленький) Будьте в курсе новых возможностей cлужб Integration Services

Чтобы загрузить последнюю документацию, статьи, образцы и видеоматериалы от Майкрософт, а также лучшие решения от участников сообщества, посетите страницу служб Integration Services на сайтах MSDN или TechNet.

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