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>(string FILTER); |
例如,以下代码显示了为 APPS 架构下 CUSTOMER 数据库表中生成的 WCF 客户端类的 Update_PHOTO 和 Read_PHOTO 操作的方法签名。
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 E-Business Suite 适配器的 WCF 服务模型概述中介绍。 本部分介绍如何创建 WCF 客户端来调用 CUSTOMER 数据库表上的 Update_PHOTO 和 Read_PHOTO 操作。
创建 WCF 客户端
在 Visual Studio 中创建 Visual C# 项目。 对于本主题,请创建控制台应用程序。
为 CUSTOMER 数据库表上的 Update_PHOTO 和 Read_PHOTO 操作生成 WCF 客户端类。 有关生成 WCF 客户端类的详细信息,请参阅 为 Oracle E-Business Suite 解决方案项目生成 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 列的内容。