Создание назначения ODBC с помощью компонента скрипта
В службах SQL Server Integration Services, как правило, сохранение данных в назначение ODBC осуществляется с использованием назначения ADO.NET и поставщика данных платформы .NET Framework для ODBC. Однако можно также создать нерегламентированное назначение ODBC для использования в отдельном пакете. Для создания такого нерегламентированного назначения ODBC используется компонент скрипта, показанный в следующем примере.
Примечание |
---|
Если нужно создать компонент, который будет полезен в нескольких задачах потока данных и нескольких пакетах, рекомендуется в качестве основы использовать этот образец компонента скрипта. Дополнительные сведения см. в разделе Разработка пользовательского компонента потока данных. |
Пример
В следующем примере демонстрируется, как создать целевой компонент, который использует существующий диспетчер соединений ODBC для сохранения данных из потока данных в таблицу Microsoft SQL Server.
Этот пример представляет собой измененную версию пользовательского назначения ADO.NET, приведенного ранее в разделе Создание назначения с помощью компонента скрипта. Однако в данном примере пользовательское назначение ADO.NET изменено для работы с диспетчером соединений ODBC и сохранения данных в назначение ODBC. Были внесены, в частности, следующие изменения:
Нельзя вызывать метод AcquireConnection диспетчера соединений ODBC из управляемого кода, поскольку при этом возвращается собственный объект. Поэтому в данном образце строка соединения диспетчера соединений используется для соединения с источником данных непосредственно с помощью управляемого поставщика данных ODBC платформы .NET Framework.
Команда OdbcCommand ожидает позиционированных параметров. Позиции параметров отмечаются вопросительными знаками (?) в тексте команды. (Команда SqlCommand, напротив, ожидает именованных параметров.)
В этом примере используется таблица Person.Address образца базы данных База данных AdventureWorks2008R2. В примере первый и четвертый столбцы этой таблицы, int AddressID и nvarchar(30) City, передаются через поток данных. Эти же данные используются в образцах источника, преобразования и назначения в разделе Разработка определенных типов компонента скрипта.
Настройка этого примера компонента скрипта
Создайте диспетчер соединений ODBC, который соединяется с базой данных База данных AdventureWorks2008R2.
Создайте целевую таблицу, выполнив следующую команду Transact-SQL в базе данных База данных AdventureWorks2008R2.
CREATE TABLE [Person].[Address2]( [AddressID] [int] NOT NULL, [City] [nvarchar](30) NOT NULL )
Добавьте новый компонент скрипта в область конструктора потока данных и настройте его в качестве назначения.
Соедините выход источника или преобразования, расположенного выше в потоке данных, с компонентом назначения в конструкторе служб SSIS. (Можно соединить источник непосредственно с назначением, не выполняя никаких преобразований.) Чтобы обеспечить работу этого образца, необходимо включить в выход вышестоящего компонента по крайней мере столбцы AddressID и City из таблицы Person.Address образца базы данных База данных AdventureWorks2008R2.
Откройте редактор преобразования «Скрипт». На странице Input Columns выберите столбцы AddressID и City.
На странице Входы и выходы измените имя входа на более описательное, например MyAddressInput.
На странице Диспетчеры соединений добавьте или создайте диспетчер соединений ODBC с описательным именем, например MyODBCConnectionManager.
На странице Скрипт нажмите кнопку Изменить скрипт и введите следующий код в класс ScriptMain.
Закройте среду разработки скриптов и редактор преобразования «Скрипт», затем выполните образец.
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(); } }
|