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 配接器的範例。 在 Oracle E-Business 配接器範例中,包含一個名為 LargeDataTypes_ServiceModel 的範例,這是基於本主題的。
備註
本主題列出了更新和讀取資料庫數據表中大型數據類型之欄位的詳細任務。 您必須執行相同的工作集,才能更新和讀取介面數據表中大型數據類型的數據行。
WCF 用戶端類別
Oracle E-Business 配接器針對具有大型數據類型之數據表上作業所產生的 WCF 用戶端名稱是以數據表的名稱為基礎,如下表所列。
| 文物 | WCF 用戶端名稱 |
|---|---|
| 介面數據表 | InterfaceTables_[APP_NAME][SCHEMA]\[TABLE_NAME]客戶端 |
[APP_NAME] = Oracle E-Business Suite 應用程式的實際名稱;例如,FND。
[SCHEMA] = 工件集合;例如,應用程式。
[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 服務模型概觀中所述的一組工作。 本節說明如何建立 WCF 用戶端,以在 CUSTOMER 資料庫數據表上叫用Update_PHOTO和Read_PHOTO作業。
建立 WCF 用戶端
在 Visual Studio 中建立 Visual C# 專案。 針對本主題,建立主控台應用程式。
針對 CUSTOMER 資料庫數據表上的Update_PHOTO和Read_PHOTO作業產生 WCF 用戶端類別。 如需產生 WCF 用戶端類別的詳細資訊,請參閱 產生 WCF 用戶端或 Oracle E-Business Suite 解決方案成品的 WCF 服務合約。
這很重要
產生 WCF 用戶端類別之前,請確定您已將 EnableBizTalkCompatibilityMode 系結屬性設定為 false。
在 [方案總管] 中,新增對
Microsoft.Adapters.OracleEBS、Microsoft.ServiceModel.Channels和System.Transactions的參考。開啟Program.cs檔案,並新增下列命名空間:
Microsoft.Adapters.OracleEBSSystem.ServiceModelSystem.TransactionsSystem.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 ,而且Update_PHOTO作業必須在交易範圍內執行。 您可以在 app.config 中設定 UseAmbientTransaction 系結屬性,或在應用程式中明確將它設定為
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作業之後,就會在專案的 bin 目錄下複製檔案 PhotoCopy.jpg。
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 資料行的內容。