WCF サービス モデルを使用した Oracle E-Business Suite の大規模なデータ型を持つテーブルに対する完全な操作
Oracle E-Business アダプターを使用すると、アダプター クライアントは、BLOB、CLOB、NCLOB、BFILE などの大きなデータ型を持つインターフェイス テーブルとビューに対して操作を実行できます。
BLOB、CLOB、NCLOB 型の列の場合、アダプターを使用すると、クライアントはデータの読み取りと更新を行うことができます。 アダプターは、<Read_LOBColName> 操作と Update_<LOBColName> 操作を公開して、それぞれデータの読み取りと更新を行います。ここで<、LOBColName> は大きなデータ型を持つ列の名前です。 1 つのインターフェイス テーブルに大きなデータ型を持つ列が複数ある場合、アダプターはそのインターフェイス テーブルの読み取り操作と更新操作を同数だけ公開します。
BFILE 型の列の場合、アダプター クライアントはデータの読み取りのみを行うことができます。 アダプターは、BFILE 型の列からデータを読み取るために、Read_<LOBColName> 操作を公開します。 1 つのインターフェイス テーブルに大きなデータ型を持つ列が複数ある場合、アダプターはインターフェイス テーブルの読み取り操作をできるだけ多く公開します。
これらの操作の詳細については、「 インターフェイス テーブル、インターフェイス ビュー、テーブル、および LOB データを含むビューに対する操作」を参照してください。
このトピックで使用する例について
このトピックの例では、CUSTOMER データベース テーブルの BLOB 列 (PHOTO) を更新し、同じ列からデータを取得します。 このテーブルは、サンプルに付属のスクリプトを実行して作成されます。 サンプルの詳細については、「 Oracle EBS アダプターのサンプル」を参照してください。 このトピックに基づく サンプル LargeDataTypes_ServiceModelは、Oracle E-Business アダプターのサンプルでも提供されています。
Note
このトピックでは、ベース データベース テーブル内の大きなデータ型の列を更新および読み取るための詳細なタスクを示します。 インターフェイス テーブル内の大きなデータ型の列を更新および読み取る場合は、同じタスク セットを実行する必要があります。
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 クライアントです。 このファイルは、アダプター サービス参照の追加プラグインによって生成されます。Note
このスニペットでは、構成ファイルのバインドアドレスとエンドポイント アドレスを使用 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操作を実行する必要があります。 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操作が完了すると、プロジェクトの 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 列の内容を読み取ります。