使用 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 配接器的範例。 Oracle E-Business 配接器範例也會提供以本主題為基礎的範例 LargeDataTypes_ServiceModel。
注意
本主題列出更新和讀取基底資料庫資料表中大型資料類型資料行的詳細工作。 您必須執行相同的工作集,以更新和讀取介面資料表中大型資料類型的資料行。
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> (字串 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.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 ,而且必須在交易範圍內執行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 資料行的內容。