使用 WCF 服务模型对 Oracle 电子商务套件中具有大型数据类型的表完成操作
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 电子商务适配器示例一起提供。
注意
本主题列出了用于更新和读取基数据库表中大型数据类型的列的详细任务。 必须执行相同的一组任务来更新和读取接口表中大型数据类型的列。
WCF 客户端类
为 Oracle 电子商务适配器针对具有大型数据类型的表的操作生成的 WCF 客户端的名称基于表的名称,如下表所示。
项目 | WCF 客户端名称 |
---|---|
接口表 | InterfaceTables_[APP_NAME][SCHEMA]\[TABLE_NAME]Client |
[APP_NAME] = Oracle 电子商务套件应用程序的实际名称;例如 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 电子商务套件上执行操作所需的通用操作集涉及 使用 Oracle 电子商务套件适配器的 WCF 服务模型概述中所述的一组任务。 本部分介绍如何创建 WCF 客户端以调用对 CUSTOMER 数据库表Update_PHOTO和Read_PHOTO操作。
创建 WCF 客户端
在 Visual Studio 中创建 Visual C# 项目。 对于本主题,请创建控制台应用程序。
为 CUSTOMER 数据库表上的Update_PHOTO和Read_PHOTO操作生成 WCF 客户端类。 有关生成 WCF 客户端类的详细信息,请参阅 为 Oracle 电子商务套件解决方案项目生成 WCF 客户端或 WCF 服务协定。
重要
在生成 WCF 客户端类之前,请确保将 EnableBizTalkCompatibilityMode 绑定属性设置为 false。
在解决方案资源管理器,添加对
Microsoft.Adapters.OracleEBS
和Microsoft.ServiceModel.Channels
的System.Transactions
引用。打开 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操作后,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 列的内容。