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

В службах SQL ServerIntegration Services, как правило, сохранение данных в назначение ODBC осуществляется с использованием назначения ADO.NET и поставщика данных платформы .NET Framework для ODBC. Однако можно также создать нерегламентированное назначение ODBC для использования в отдельном пакете. Для создания такого нерегламентированного назначения ODBC используется компонент сценария, показанный в следующем примере.

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

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

Примеры

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

Этот пример представляет собой измененную версию пользовательского назначения ADO.NET, приведенного ранее в разделе Создание назначения с помощью компонента сценария. Однако в данном примере пользовательское назначение ADO.NET изменено для работы с диспетчером соединений ODBC и сохранения данных в назначение ODBC. Были внесены, в частности, следующие изменения:

  • Нельзя вызывать метод AcquireConnection диспетчера соединений ODBC из управляемого кода, поскольку при этом возвращается собственный объект. Поэтому в данном образце строка соединения диспетчера соединений используется для соединения с источником данных непосредственно с помощью управляемого поставщика данных ODBC платформы .NET Framework.

  • Команда OdbcCommand ожидает позиционированных параметров. Позиции параметров отмечаются вопросительными знаками (?) в тексте команды. (Команда SqlCommand, напротив, ожидает именованных параметров.)

В этом примере используется таблица Person.Address образца базы данных AdventureWorks. В примере первый и четвертый столбцы этой таблицы, intAddressID и nvarchar(30)City, передаются через поток данных. Эти же данные используются в образцах источника, преобразования и назначения в разделе Разработка определенных типов компонента сценария.

Настройка этого примера компонента сценария

  1. Создайте диспетчер соединений ODBC, который соединяется с базой данных AdventureWorks.

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

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

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

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

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

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

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

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

    Imports System.Data.Odbc
    ...
    Public Class ScriptMain
        Inherits UserComponent
    
        Dim odbcConn As OdbcConnection
        Dim odbcCmd As OdbcCommand
        Dim odbcParam As OdbcParameter
    
        Public Overrides Sub AcquireConnections(ByVal Transaction As Object)
    
            Dim connectionString As String
            connectionString = Me.Connections.MyODBCConnectionManager.ConnectionString
            odbcConn = New OdbcConnection(connectionString)
            odbcConn.Open()
    
        End Sub
    
        Public Overrides Sub PreExecute()
    
            odbcCmd = New OdbcCommand("INSERT INTO Person.Address2(AddressID, City) " & _
                "VALUES(?, ?)", odbcConn)
            odbcParam = New OdbcParameter("@addressid", OdbcType.Int)
            odbcCmd.Parameters.Add(odbcParam)
            odbcParam = New OdbcParameter("@city", OdbcType.NVarChar, 30)
            odbcCmd.Parameters.Add(odbcParam)
    
        End Sub
    
        Public Overrides Sub MyAddressInput_ProcessInputRow(ByVal Row As MyAddressInputBuffer)
    
            With odbcCmd
                .Parameters("@addressid").Value = Row.AddressID
                .Parameters("@city").Value = Row.City
                .ExecuteNonQuery()
            End With
    
        End Sub
    
        Public Overrides Sub ReleaseConnections()
    
            odbcConn.Close()
    
        End Sub
    
    End Class
    
    using System.Data.Odbc;
    ...
    public class ScriptMain :
        UserComponent
    {
        OdbcConnection odbcConn;
        OdbcCommand odbcCmd;
        OdbcParameter odbcParam;
    
        public override void AcquireConnections(object Transaction)
        {
    
            string connectionString;
            connectionString = this.Connections.MyODBCConnectionManager.ConnectionString;
            odbcConn = new OdbcConnection(connectionString);
            odbcConn.Open();
    
        }
    
        public override void PreExecute()
        {
    
            odbcCmd = new OdbcCommand("INSERT INTO Person.Address2(AddressID, City) " +
                "VALUES(?, ?)", odbcConn);
            odbcParam = new OdbcParameter("@addressid", OdbcType.Int);
            odbcCmd.Parameters.Add(odbcParam);
            odbcParam = new OdbcParameter("@city", OdbcType.NVarChar, 30);
            odbcCmd.Parameters.Add(odbcParam);
    
        }
    
        public override void MyAddressInput_ProcessInputRow(MyAddressInputBuffer Row)
        {
    
            {
                odbcCmd.Parameters["@addressid"].Value = Row.AddressID;
                odbcCmd.Parameters["@city"].Value = Row.City;
                odbcCmd.ExecuteNonQuery();
            }
    
        }
    
        public override void ReleaseConnections()
        {
    
            odbcConn.Close();
    
        }
    }
    
Значок служб Integration Services (маленький)Будьте в курсе новых возможностей cлужб Integration Services

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

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