스크립트 구성 요소를 사용하여 ODBC 대상 만들기
적용 대상: Azure Data Factory의 SQL Server SSIS Integration Runtime
SQL Server Integration Services에서는 일반적으로 ADO.NET 대상 및 .NET Framework Data Provider for ODBC를 사용하여 데이터를 ODBC 대상에 저장합니다. 그러나 단일 패키지에서 사용할 임시 ODBC 대상을 만들 수도 있습니다. 이 임시 ODBC 대상을 만들려면 다음 예제와 같이 스크립트 구성 요소를 사용합니다.
참고 항목
여러 데이터 흐름 태스크 및 여러 패키지에서 쉽게 다시 사용할 수 있는 구성 요소를 만들려면 이 스크립트 구성 요소 예제에 있는 코드를 바탕으로 사용자 지정 데이터 흐름 구성 요소를 만들어 보십시오. 자세한 내용은 사용자 지정 데이터 흐름 구성 요소 개발을 참조하세요.
예시
다음 예제에서는 기존 ODBC 연결 관리자를 사용하여 데이터 흐름의 데이터를 Microsoft SQL Server 테이블로 저장하는 대상 구성 요소를 만드는 방법을 보여 줍니다.
이 예제는 스크립트 구성 요소를 사용하여 대상 만들기 항목에 설명된 사용자 지정 ADO.NET 대상의 수정된 버전입니다. 그러나 이 예제에서는 사용자 지정 ADO.NET 대상이 ODBC 연결 관리자와 함께 작동하고 데이터를 ODBC 대상에 저장하도록 수정되었습니다. 이러한 수정 사항에는 다음과 같은 변경 내용도 포함됩니다.
ODBC 연결 관리자의 AcquireConnection 메서드는 네이티브 개체를 반환하므로 관리 코드에서 이 메서드를 호출할 수 없습니다. 따라서 이 샘플에서는 관리되는 ODBC .NET Framework 데이터 공급자를 사용하여 연결 관리자의 연결 문자열 사용하여 데이터 원본에 직접 연결합니다.
OdbcCommand에는 위치 매개 변수가 예상됩니다. 매개 변수의 위치는 명령 텍스트의 물음표(?)로 표시됩니다. (대조적으로, a SqlCommand 에는 명명된 매개 변수가 필요합니다.)
이 예에서는 AdventureWorks 예제 데이터베이스의 Person.Address 테이블을 사용하고, 이 테이블의 첫 번째 열인 int AddressID와 네 번째 열인 nvarchar(30) City 열을 데이터 흐름을 통해 전달합니다. 이 동일한 데이터는 특정 유형의 스크립트 구성 요소 개발 항목의 원본, 변환 및 대상 샘플에서 사용됩니다.
스크립트 구성 요소 예를 구성하려면
AdventureWorks 데이터베이스에 연결하는 ODBC 연결 관리자를 만듭니다 .
AdventureWorks 데이터베이스에서 다음 Transact-SQL 명령을 실행하여 대상 테이블을 만듭니다.
CREATE TABLE [Person].[Address2]([AddressID] [int] NOT NULL, [City] [nvarchar](30) NOT NULL)
데이터 흐름 디자이너 화면에 새 스크립트 구성 요소를 추가하고 대상으로 구성합니다.
업스트림 원본 또는 변환의 출력을 SSIS 디자이너의 대상 구성 요소에 연결합니다. (변환 없이 원본을 대상에 직접 연결할 수 있습니다.) 이 샘플이 작동하는지 확인하려면 업스트림 구성 요소의 출력에 AdventureWorks 샘플 데이터베이스의 Person.Address 테이블의 AddressID 및 City 열 이상이 포함되어야 합니다.
스크립트 변환 편집기를 엽니다. 입력 열 페이지에서 AddressID 및 City 열을 선택합니다.
입력 및 출력 페이지에서 입력 이름을 MyAddressInput과 같은 보다 설명적인 이름으로 바꿉니다.
연결 관리자 페이지에서 MyODBCConnectionManager와 같은 설명이 포함된 이름으로 ODBC 연결 관리자를 추가하거나 만듭니다.
스크립트 페이지에서 스크립트 편집을 클릭한 다음 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(); } }