Oracle E-Business アダプターを使用すると、アダプター クライアントは、BLOB、CLOB、NCLOB、BFILE などの大きなデータ型のインターフェイス テーブルとビューに対して操作を実行できます。
BLOB、CLOB、NCLOB 型の列の場合、アダプターを使用すると、クライアントはデータの読み取りと更新を行うことができます。 アダプターは、それぞれデータの読み取りと更新を行うために、Read_<LOBColName> および Update_<LOBColName> 操作を公開します。ここで、 <LOBColName> は大きなデータ型を持つ列の名前です。 1 つのインターフェイス テーブルに大きなデータ型を持つ列が複数ある場合、アダプターはそのインターフェイス テーブルの読み取り操作と更新操作をできるだけ多く公開します。
BFILE 型の列の場合、アダプター クライアントはデータのみを読み取ることができます。 アダプターは、READ_LOBColName 操作を公開して、BFILE 型の列からデータを読み取ります。 1 つのインターフェイス テーブルに大きなデータ型を持つ列が複数ある場合、アダプターはインターフェイス テーブルの読み取り操作をできるだけ多く公開します。
これらの操作の詳細については、「 インターフェイス テーブル、インターフェイス ビュー、テーブル、および LOB データを含むビューに対する操作」を参照してください。
このトピックで使用する例について
このトピックの例では、CUSTOMER データベース テーブルの BLOB 列 (PHOTO) を更新し、同じ列からデータを取得します。 このテーブルは、サンプルで提供されるスクリプトを実行して作成されます。 サンプルの詳細については、 Oracle EBS アダプターのサンプルを参照してください。 このトピックに基づく サンプル LargeDataTypes_ServiceModelは、Oracle E-Business アダプターのサンプルでも提供されています。
注
このトピックでは、ベース データベース テーブル内の大きなデータ型の列を更新および読み取るための詳細なタスクを示します。 インターフェイス テーブル内の大きなデータ型の列を更新および読み取る場合は、同じ一連のタスクを実行する必要があります。
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。
テーブルに対する操作を呼び出すためのメソッド シグネチャ
次の表は、テーブルに対する基本的な操作のメソッド シグネチャを示しています。 シグネチャはビューに対して同じですが、ビューの名前空間と名前がテーブルの名前に置き換えられる点が異なります。
| オペレーション | メソッド シグネチャ |
|---|---|
| アップデート_<column_name> | public void Update_<column_name>(string FILTER, byte[] DATA); |
| 読み込み_<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 サービス コントラクトを生成する」を参照してください。
Von Bedeutung
WCF クライアント クラスを生成する前に、 EnableBizTalkCompatibilityMode バインディング プロパティを false に設定してください。
ソリューション エクスプローラーで、
System.TransactionsMicrosoft.Adapters.OracleEBSとMicrosoft.ServiceModel.Channelsへの参照を追加します。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";Von Bedeutung
この例では、データベース テーブルに対して操作を実行しています。 ただし、インターフェイス テーブルに対して操作を実行する場合は、 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 ディレクトリにコピーする必要があります。
Von Bedeutung
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操作が完了すると、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 列の内容を読み取ります。