WCF 서비스 모델을 사용하여 Oracle E-Business Suite에서 데이터 형식이 큰 테이블에 대한 작업 완료
Oracle E-Business 어댑터를 사용하면 어댑터 클라이언트가 BLOB, CLOB, NCLOB 및 BFILE과 같은 대용량 데이터 형식의 인터페이스 테이블 및 뷰에서 작업을 수행할 수 있습니다.
BLOB, CLOB 및 NCLOB 형식의 열의 경우 어댑터를 사용하면 클라이언트가 데이터를 읽고 업데이트할 수 있습니다. 어댑터는 Read_<LOBColName> 및 Update_<LOBColName> 작업을 노출하여 데이터를 각각 읽고 업데이트합니다. 여기서 <LOBColName> 은 큰 데이터 형식의 열 이름입니다. 단일 인터페이스 테이블에 큰 데이터 형식의 열이 두 개 이상 있는 경우 어댑터는 해당 인터페이스 테이블에 대해 많은 읽기 및 업데이트 작업을 노출합니다.
BFILE 형식의 열의 경우 어댑터 클라이언트는 데이터만 읽을 수 있습니다. 어댑터는 Read_<LOBColName> 작업을 노출하여 BFILE 형식의 열에서 데이터를 읽습니다. 단일 인터페이스 테이블에 큰 데이터 형식의 열이 두 개 이상 있는 경우 어댑터는 인터페이스 테이블에 대해 많은 읽기 작업을 노출합니다.
이러한 작업에 대한 자세한 내용은 LOB 데이터를 포함하는 인터페이스 테이블, 인터페이스 뷰, 테이블 및 뷰에 대한 작업을 참조하세요.
이 항목에 사용된 예제 정보
이 항목의 예제에서는 CUSTOMER 데이터베이스 테이블의 BLOB 열(PHOTO)을 업데이트한 다음, 동일한 열에서 데이터를 검색합니다. 테이블은 샘플과 함께 제공되는 스크립트를 실행하여 만듭니다. 샘플에 대한 자세한 내용은 Oracle EBS 어댑터에 대한 샘플을 참조하세요. 이 항목을 기반으로 하는 샘플 LargeDataTypes_ServiceModel Oracle E-Business 어댑터 샘플도 제공됩니다.
참고
이 항목에서는 기본 데이터베이스 테이블에서 큰 데이터 형식의 열을 업데이트하고 읽기 위한 자세한 작업을 나열합니다. 인터페이스 테이블에서 큰 데이터 형식의 열을 업데이트하고 읽기 위해 동일한 작업 집합을 수행해야 합니다.
WCF 클라이언트 클래스
Oracle E-Business 어댑터에서 큰 데이터 형식의 테이블에 대해 생성된 WCF 클라이언트의 이름은 다음 표에 나열된 테이블의 이름을 기반으로 합니다.
아티팩트 | WCF 클라이언트 이름 |
---|---|
인터페이스 테이블 | InterfaceTables_[APP_NAME][SCHEMA]\[TABLE_NAME]Client |
[APP_NAME] = Oracle E-Business Suite 애플리케이션의 실제 이름입니다. 예를 들어 FND입니다.
[SCHEMA] = 아티팩트 컬렉션; 예를 들어 APPS입니다.
[TABLE_NAME] = 테이블의 이름입니다. 예를 들어 MS_SAMPLE_EMPLOYEE.
[VIEW_NAME] = 뷰의 이름입니다. 예를 들어 MS_SAMPLE_EMPLOYEE_View.
테이블에서 작업을 호출하기 위한 메서드 서명
다음 표에서는 테이블의 기본 작업에 대한 메서드 서명을 보여 줍니다. 뷰 네임스페이스와 이름이 테이블의 네임스페이스를 대체한다는 점을 제외하면 보기의 서명은 동일합니다.
작업 | 메서드 시그니처 |
---|---|
< Update_column_name> | public void Update_<column_name>(string FILTER, byte[] DATA); |
< Read_column_name> | public System.IO.Stream Read_<column_name>(string FILTER); |
예를 들어 다음 코드는 APPS 스키마 아래의 CUSTOMER 데이터베이스 테이블에서 Update_PHOTO 및 Read_PHOTO 작업에 대해 생성된 WCF 클라이언트 클래스에 대한 메서드 서명을 보여 줍니다.
public partial class Tables_APPS_CUSTOMERClient : System.ServiceModel.ClientBase<Tables_APPS_CUSTOMER>, Tables_APPS_CUSTOMER {
public void Update_PHOTO(string FILTER, byte[] DATA);
public System.IO.Stream Read_PHOTO(string FILTER);
}
이 코드 조각에서 Tables_APPS_CUSTOMERClient 어댑터 서비스 참조 플러그 인 추가에서 생성된 OracleEBSBindingClient.cs의 WCF 클래스 이름입니다. Update_PHOTO 및 Read_PHOTO 테이블에서 큰 데이터 형식의 열을 업데이트하고 읽기 위해 호출할 수 있는 메서드입니다.
테이블 작업에 대한 매개 변수
이 섹션에서는 Update_column_name 및 Read_<<column_name>> 작업에 필요한 매개 변수를 제공합니다.
작업 이름 | 매개 변수 |
---|---|
< Update_column_name> | 다음 매개 변수가 필요합니다. - string FILTER . 이 매개 변수는 데이터를 업데이트해야 하는 레코드를 나타내는 where 절을 포함해야 합니다. 예: "WHERE Name='Mindy Martin'" .- byte[] DATA . 큰 데이터 형식의 열에서 업데이트할 데이터의 바이트 배열을 포함합니다. |
< Read_column_name> | 다음 매개 변수가 필요합니다. - string FILTER . 이 매개 변수는 데이터를 읽어야 하는 레코드를 나타내는 where 절을 포함해야 합니다. 예들 들어 "WHERE Name='Mindy Martin'" 입니다. |
큰 데이터 형식의 열이 있는 테이블에서 작업을 호출하는 WCF 클라이언트 만들기
WCF 클라이언트를 사용하여 Oracle E-Business Suite에서 작업을 수행하는 데 필요한 일반 작업 집합에는 Oracle E-Business Suite 어댑터를 사용한 WCF 서비스 모델 개요에 설명된 작업 집합이 포함됩니다. 이 섹션에서는 CUSTOMER 데이터베이스 테이블에서 Update_PHOTO 및 Read_PHOTO 작업을 호출하는 WCF 클라이언트를 만드는 방법을 설명합니다.
WCF 클라이언트를 만들려면
Visual Studio에서 Visual C# 프로젝트를 만듭니다. 이 항목에서는 콘솔 애플리케이션을 만듭니다.
CUSTOMER 데이터베이스 테이블에서 Update_PHOTO 및 Read_PHOTO 작업에 대한 WCF 클라이언트 클래스를 생성합니다. WCF 클라이언트 클래스를 생성하는 방법에 대한 자세한 내용은 Oracle E-Business Suite 솔루션 아티팩트용 WCF 클라이언트 또는 WCF 서비스 계약 생성을 참조하세요.
중요
WCF 클라이언트 클래스를 생성하기 전에 EnableBizTalkCompatibilityMode 바인딩 속성을 false로 설정해야 합니다.
솔루션 탐색기 및
Microsoft.ServiceModel.Channels
에System.Transactions
대한 참조를Microsoft.Adapters.OracleEBS
추가합니다.Program.cs 파일을 열고 다음 네임스페이스를 추가합니다.
Microsoft.Adapters.OracleEBS
System.ServiceModel
System.Transactions
System.IO
Program.cs 파일을 열고 아래 코드 조각에 설명된 대로 클라이언트를 만듭니다.
Tables_APPS_CUSTOMERClient client = new Tables_APPS_CUSTOMERClient("OracleEBSBinding_Tables_APPS_CUSTOMER"); client.ClientCredentials.UserName.UserName = "<Enter user name here>"; client.ClientCredentials.UserName.Password = "<Enter password here>";
이 코드 조각
Tables_APPS_CUSTOMERClient
에서 는 OracleEBSBindingClient.cs에 정의된 WCF 클라이언트입니다. 이 파일은 어댑터 서비스 참조 추가 플러그 인에서 생성됩니다.참고
이 코드 조각에서는 구성 파일 app.config 바인딩 및 엔드포인트 주소를 사용합니다. 코드에서 이러한 값을 명시적으로 지정할 수도 있습니다. 클라이언트 바인딩을 지정하는 다양한 방법에 대한 자세한 내용은 Oracle E-Business Suite에 대한 클라이언트 바인딩 구성을 참조하세요.
클라이언트에 대한 자격 증명을 설정합니다.
client.ClientCredentials.UserName.UserName = "myuser"; client.ClientCredentials.UserName.Password = "mypassword";
중요
이 예제에서는 데이터베이스 테이블에 대한 작업을 수행합니다. 그러나 인터페이스 테이블에서 작업을 수행하는 경우 OracleUserName, OraclePassword 및 OracleEBSResponsibilityName 바인딩 속성에 적절한 값을 지정하여 애플리케이션 컨텍스트를 설정해야 합니다. 클라이언트를 열기 전에 이러한 바인딩 속성을 지정해야 합니다. 애플리케이션 컨텍스트에 대한 자세한 내용은 애플리케이션 컨텍스트 설정을 참조하세요.
아래 코드 조각에 설명된 대로 클라이언트를 엽니다.
try { Console.WriteLine("Opening Client..."); client.Open(); } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); throw; }
CUSTOMER 테이블에서 Update_PHOTO 작업을 호출합니다.
Update_PHOTO 작업을 수행하려면 데이터를 업데이트하려면 바이트 배열이 필요합니다. 이 코드 조각에서는 FileStream 클래스를 사용하여 SamplePhoto.jpg 사진에 대한 바이트 배열을 만듭니다. 이 애플리케이션이 작동하려면 파일을 프로젝트의 bin 디렉터리에 복사해야 합니다.
중요
트랜잭션에서 Update_PHOTO 작업을 수행해야 하므로 UseAmbientTransaction 바인딩 속성을 true로 설정하고 트랜잭션 scope 내에서 Update_PHOTO 작업을 수행해야 합니다. UseAmbientTransaction 바인딩 속성을 app.config 설정하거나 애플리케이션
binding.UseAmbientTransaction = true
에서 명시적으로 로 설정할 수 있습니다. 코드에서 바인딩 속성을 명시적으로 지정하는 경우 클라이언트를 열기 전에 바인딩 속성을 지정해야 합니다.byte[] photo; using (FileStream fs = new FileStream("SamplePhoto.jpg", FileMode.Open)) { try { Console.WriteLine("Reading the photo"); int count = 0; photo = new byte[fs.Length]; while ((count += fs.Read(photo, count, (int)(((fs.Length - count) > 4096) ? 4096 : fs.Length - count))) < fs.Length) ; } catch(Exception ex) { Console.WriteLine("Exception: " + ex.Message); throw; } } Console.WriteLine("Updating data for the 'PHOTO' column"); // Invoking the Update_PHOTO operation inside a transaction scope using (TransactionScope tx = new TransactionScope()) { string filter = "WHERE Name='Mindy Martin'"; client.Update_PHOTO(filter, photo); tx.Complete(); }
CUSTOMER 테이블에서 Read_PHOTO 작업을 호출합니다.
Read_PHOTO 출력을 System.IO.Stream 형식으로 제공합니다. 어댑터 클라이언트는 fileStream 클래스를 구현하여 Read_PHOTO 작업에서 데이터를 읽어야 합니다. Read_PHOTO 작업이 완료되면 파일 PhotoCopy.jpg 프로젝트의 bin 디렉터리 아래에 복사됩니다.
using (FileStream fs = new FileStream("PhotoCopy.jpg", FileMode.Create)) { Console.WriteLine("Reading photo data"); String ReadFilter = "WHERE NAME='Mindy Martin'"; Stream photoStream = client.Read_PHOTO(ReadFilter); Console.WriteLine("Photo data read -- writing to PhotoCopy.jpg"); int count; int length = 0; byte[] buffer = new byte[4096]; while ((count = photoStream.Read(buffer, 0, 4096)) > 0) { fs.Write(buffer, 0, count); length+=count; } Console.WriteLine("{0} bytes written to PhotoCopy.jpg", length); } Console.WriteLine("Photo updated and read back -- Hit <RETURN> to end"); Console.ReadLine();
아래 코드 조각에 설명된 대로 클라이언트를 닫습니다.
client.Close(); Console.WriteLine("Press any key to exit..."); Console.ReadLine();
프로젝트를 빌드한 다음 실행합니다. 애플리케이션은 CUSTOMER 테이블의 PHOTO 열을 업데이트한 다음 PHOTO 열의 내용을 읽습니다.